/ Hex Artifact Content
Login

Artifact 8f5a2e9aae567ddf24976c708ac3cdb0b6e61b31:


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 35 36 20 32 30 30 39 2f 30  c,v 1.556 2009/0
0190: 31 2f 30 36 20 31 38 3a 32 31 3a 30 39 20 64 61  1/06 18:21:09 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: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
2450: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
2460: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2470: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
2480: 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75  Cur, 0, (int)pCu
2490: 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  r->nKey, pKey);.
24a0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
24b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24c0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
24d0: 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pKey;.      }els
24e0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
24f0: 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20  e3_free(pKey);. 
2500: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2510: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2520: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2530: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2540: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
2550: 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72  >intKey || !pCur
2560: 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28  ->pKey );..  if(
2570: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2580: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2590: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
25a0: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
25b0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
25c0: 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
25d0: 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ]);.      pCur->
25e0: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
25f0: 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
2600: 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70  Page = -1;.    p
2610: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2620: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2630: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64  ;.  }..  invalid
2640: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
2650: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
2660: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
2670: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2680: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
2690: 65 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f  except pExcept o
26a0: 70 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  pen on the table
26b0: 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70   .** with root-p
26c0: 61 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c  age iRoot. Usual
26d0: 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c  ly, this is call
26e0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
26f0: 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74  ursor.** pExcept
2700: 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69   is used to modi
2710: 66 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74  fy the table (Bt
2720: 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42  reeDelete() or B
2730: 74 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a  treeInsert())..*
2740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
2750: 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68  eAllCursors(BtSh
2760: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
2770: 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  iRoot, BtCursor 
2780: 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43  *pExcept){.  BtC
2790: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
27a0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
27b0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
27c0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
27d0: 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45  pExcept==0 || pE
27e0: 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20  xcept->pBt==pBt 
27f0: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
2800: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
2810: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
2820: 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28   p!=pExcept && (
2830: 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70  0==iRoot || p->p
2840: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20  gnoRoot==iRoot) 
2850: 26 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  && .        p->e
2860: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2870: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  LID ){.      int
2880: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
2890: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
28a0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
28b0: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
28c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
28e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
2900: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
2910: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
2920: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
2930: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
2940: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2950: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2960: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2970: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2980: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
2990: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
29a0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
29b0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
29c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
29d0: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
29e0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
29f0: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
2a00: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
2a10: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
2a20: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
2a30: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
2a40: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
2a50: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
2a60: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
2a70: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
2a80: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
2a90: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
2aa0: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
2ab0: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
2ac0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2ad0: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
2ae0: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
2af0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
2b00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2b10: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
2b20: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
2b30: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
2b40: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  rc;.  assert( cu
2b50: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2b60: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b70: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
2b80: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2b90: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
2ba0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2bb0: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
2bc0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b  turn pCur->skip;
2bd0: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74  .  }.  pCur->eSt
2be0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2bf0: 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ALID;.  rc = sql
2c00: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
2c10: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
2c20: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
2c30: 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20   &pCur->skip);. 
2c40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c50: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2c60: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
2c70: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
2c80: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
2c90: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2ca0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
2cb0: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
2cc0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
2cd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2ce0: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
2cf0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2d00: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
2d10: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
2d20: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
2d30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
2d40: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
2d50: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
2d60: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2d70: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
2d80: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
2d90: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
2da0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
2db0: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
2dc0: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
2dd0: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
2de0: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
2df0: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
2e00: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
2e10: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
2e20: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
2e30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
2e40: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
2e50: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
2e60: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
2e70: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
2e80: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
2e90: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
2ea0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
2eb0: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
2ec0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
2ed0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
2ee0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2ef0: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
2f00: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
2f10: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2f20: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
2f30: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
2f40: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
2f50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2f60: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2f70: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f80: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d   || pCur->skip!=
2f90: 30 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  0 ){.    *pHasMo
2fa0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
2fb0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
2fc0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
2fd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2fe0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ff0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
3000: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
3010: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
3020: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
3030: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
3040: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
3050: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
3060: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
3070: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
3080: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
3090: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
30a0: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
30b0: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
30c0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
30d0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
30e0: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
30f0: 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65  Pgno iPtrMap, re
3100: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
3110: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3120: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3130: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
3140: 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  e = (pBt->usable
3150: 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74  Size/5)+1;.  iPt
3160: 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f  rMap = (pgno-2)/
3170: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
3180: 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d  ;.  ret = (iPtrM
3190: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
31a0: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
31b0: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
31c0: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
31d0: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
31e0: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
31f0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
3200: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
3210: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
3220: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70   This routine up
3230: 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65  dates the pointe
3240: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
3250: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79  page number 'key
3260: 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  '.** so that it 
3270: 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54  maps to type 'eT
3280: 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20  ype' and parent 
3290: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e  page number 'pgn
32a0: 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  o'..** An error 
32b0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
32c0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
32d0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
32e0: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
32f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
3300: 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20  mapPut(BtShared 
3310: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
3320: 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70  u8 eType, Pgno p
3330: 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65  arent){.  DbPage
3340: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
3350: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
3360: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
3370: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
3380: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
3390: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
33a0: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
33b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
33c0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
33d0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
33e0: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
33f0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
3400: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
3410: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3420: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
3430: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
3440: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
3450: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
3460: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
3470: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
3480: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
3490: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
34a0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
34b0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
34c0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
34d0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
34e0: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
34f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3500: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
3510: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
3520: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
3530: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
3540: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
3550: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
3560: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
3570: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3580: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
3590: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66  urn rc;.  }.  of
35a0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
35b0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
35c0: 20 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61 70   key);.  pPtrmap
35d0: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
35e0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
35f0: 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54  Page);..  if( eT
3600: 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66  ype!=pPtrmap[off
3610: 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65  set] || get4byte
3620: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
3630: 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a  +1])!=parent ){.
3640: 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d      TRACE(("PTRM
3650: 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28  AP_UPDATE: %d->(
3660: 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20  %d,%d)\n", key, 
3670: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b  eType, parent));
3680: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
3690: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
36a0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
36b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36c0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
36d0: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
36e0: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
36f0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
3700: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
3710: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61    }..  sqlite3Pa
3720: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
3730: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
3740: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
3750: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
3760: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
3770: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3780: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
3790: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
37a0: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
37b0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
37c0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
37d0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
37e0: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
37f0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
3800: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
3810: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
3820: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
3830: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
3840: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
3850: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
3860: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
3870: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
3880: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
3890: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
38a0: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
38b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
38c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
38d0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
38e0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
38f0: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
3900: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
3910: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
3920: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
3930: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
3940: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
3950: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
3960: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
3970: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3980: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
3990: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
39a0: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
39b0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
39c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
39d0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
39e0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
39f0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
3a00: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3a10: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
3a20: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
3a30: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
3a40: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
3a50: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
3a60: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
3a70: 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ey);.  assert( p
3a80: 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70  EType!=0 );.  *p
3a90: 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b  EType = pPtrmap[
3aa0: 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70  offset];.  if( p
3ab0: 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20  Pgno ) *pPgno = 
3ac0: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
3ad0: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20  p[offset+1]);.. 
3ae0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
3af0: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ef(pDbPage);.  i
3b00: 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20  f( *pEType<1 || 
3b10: 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75  *pEType>5 ) retu
3b20: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
3b30: 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e  T_BKPT;.  return
3b40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
3b50: 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e  else /* if defin
3b60: 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed SQLITE_OMIT_A
3b70: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23  UTOVACUUM */.  #
3b80: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
3b90: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
3ba0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
3bb0: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
3bc0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
3bd0: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
3be0: 66 6c 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  fl(y,z) SQLITE_O
3bf0: 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
3c00: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
3c10: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
3c20: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
3c30: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
3c40: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
3c50: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
3c60: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
3c70: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
3c80: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
3c90: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
3ca0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
3cb0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
3cc0: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
3cd0: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
3ce0: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
3cf0: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
3d00: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
3d10: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
3d20: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
3d30: 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65  )->aData[(P)->ce
3d40: 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29  llOffset+2*(I)])
3d50: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ))../*.** This a
3d60: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
3d70: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
3d80: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
3d90: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
3da0: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
3db0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65  flow cells.  See
3dc0: 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69   insert.*/.stati
3dd0: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
3de0: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
3df0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
3e00: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
3e10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3e20: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
3e30: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3e40: 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f   for(i=pPage->nO
3e50: 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b  verflow-1; i>=0;
3e60: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b   i--){.    int k
3e70: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76  ;.    struct _Ov
3e80: 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20  flCell *pOvfl;. 
3e90: 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67     pOvfl = &pPag
3ea0: 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  e->aOvfl[i];.   
3eb0: 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b   k = pOvfl->idx;
3ec0: 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c  .    if( k<=iCel
3ed0: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  l ){.      if( k
3ee0: 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==iCell ){.     
3ef0: 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d     return pOvfl-
3f00: 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pCell;.      }.
3f10: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
3f20: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3f30: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
3f40: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
3f50: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
3f60: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
3f70: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
3f80: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
3f90: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
3fa0: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
3fb0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
3fc0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
3fd0: 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20  eCell() takes a 
3fe0: 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61  .** cell index a
3ff0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
4000: 75 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65  ument and sqlite
4010: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
4020: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
4030: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4040: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
4050: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
4060: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  rgument..**.** W
4070: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c  ithin this file,
4080: 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29   the parseCell()
4090: 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61   macro can be ca
40a0: 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  lled instead of.
40b0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ** sqlite3BtreeP
40c0: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55  arseCellPtr(). U
40d0: 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c  sing some compil
40e0: 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ers, this will b
40f0: 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69  e faster..*/.voi
4100: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
4110: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
4120: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
4130: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
4140: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
4150: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4170: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
4180: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
4190: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
41a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
41b0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
41c0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e  re */.){.  u16 n
41d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
41f0: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
4200: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
4210: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
4220: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4230: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
4240: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
4250: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
4260: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
4270: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
4280: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
4290: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
42a0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
42b0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
42c0: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
42d0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
42e0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
42f0: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
4300: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
4310: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66  intKey ){.    if
4320: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
4330: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67   ){.      n += g
4340: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
4350: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
4360: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4370: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a    nPayload = 0;.
4380: 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67      }.    n += g
4390: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
43a0: 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  n], (u64*)&pInfo
43b0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e  ->nKey);.    pIn
43c0: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79  fo->nData = nPay
43d0: 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  load;.  }else{. 
43e0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
43f0: 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  = 0;.    n += ge
4400: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
4410: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
4420: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
4430: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a  = nPayload;.  }.
4440: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
4450: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
4460: 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d  pInfo->nHeader =
4470: 20 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79   n;.  if( likely
4480: 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65  (nPayload<=pPage
4490: 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20  ->maxLocal) ){. 
44a0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
44b0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
44c0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
44d0: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
44e0: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
44f0: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
4500: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
4510: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
4520: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20    int nSize;    
4530: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
4540: 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  ize of cell cont
4550: 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ent in bytes */.
4560: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79      nSize = nPay
4570: 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49  load + n;.    pI
4580: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
4590: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
45a0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
45b0: 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28  w = 0;.    if( (
45c0: 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29  nSize & ~3)==0 )
45d0: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
45e0: 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e  4;        /* Min
45f0: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
4600: 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  s 4 */.    }.   
4610: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
4620: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65  (u16)nSize;.  }e
4630: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
4640: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
4650: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
4660: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
4670: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
4680: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
4690: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
46a0: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
46b0: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
46c0: 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66  nto.    ** overf
46d0: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
46e0: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
46f0: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
4700: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20  nt of unused.   
4710: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
4720: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
4730: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
4740: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
4750: 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20  orage.    ** in 
4760: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
4770: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
4780: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72     **.    ** War
4790: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
47a0: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
47b0: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
47c0: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
47d0: 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72     ** way will r
47e0: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
47f0: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
4800: 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rmat..    */.   
4810: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
4820: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
4830: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
4840: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
4850: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
4860: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
4870: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
4880: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
4890: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
48a0: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
48b0: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
48c0: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
48d0: 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c  */..    minLocal
48e0: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
48f0: 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c  al;.    maxLocal
4900: 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   = pPage->maxLoc
4910: 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20  al;.    surplus 
4920: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50  = minLocal + (nP
4930: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
4940: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
4950: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
4960: 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73  .    if( surplus
4970: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
4980: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
4990: 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c  cal = (u16)surpl
49a0: 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  us;.    }else{. 
49b0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
49c0: 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63  al = (u16)minLoc
49d0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
49e0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
49f0: 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c   (u16)(pInfo->nL
4a00: 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70  ocal + n);.    p
4a10: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
4a20: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
4a30: 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e   4;.  }.}.#defin
4a40: 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67  e parseCell(pPag
4a50: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
4a60: 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   \.  sqlite3Btre
4a70: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
4a80: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
4a90: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
4aa0: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64  ), (pInfo)).void
4ab0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4ac0: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
4ad0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
4ae0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
4af0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
4b00: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
4b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4b20: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
4b30: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
4b40: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
4b50: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
4b60: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
4b70: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
4b80: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
4b90: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
4ba0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
4bb0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
4bc0: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
4bd0: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
4be0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
4bf0: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
4c00: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
4c10: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
4c20: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
4c30: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
4c40: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
4c50: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
4c60: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
4c70: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
4c80: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
4c90: 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  nter..*/.#ifndef
4ca0: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 75   NDEBUG.static u
4cb0: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
4cc0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
4cd0: 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  iCell){.  CellIn
4ce0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  fo info;.  sqlit
4cf0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
4d00: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26  (pPage, iCell, &
4d10: 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  info);.  return 
4d20: 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65  info.nSize;.}.#e
4d30: 6e 64 69 66 0a 73 74 61 74 69 63 20 75 31 36 20  ndif.static u16 
4d40: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
4d50: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
4d60: 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  pCell){.  CellIn
4d70: 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  fo info;.  sqlit
4d80: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
4d90: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
4da0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75  , &info);.  retu
4db0: 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d  rn info.nSize;.}
4dc0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4dd0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
4de0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
4df0: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
4e00: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
4e10: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
4e20: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
4e30: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
4e40: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
4e50: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
4e60: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
4e70: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
4e80: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
4e90: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
4ea0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
4eb0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
4ec0: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  o;.  assert( pCe
4ed0: 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  ll!=0 );.  sqlit
4ee0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
4ef0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
4f00: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
4f10: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
4f20: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
4f30: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
4f40: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
4f50: 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61   if( (info.nData
4f60: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
4f70: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e  0:info.nKey))>in
4f80: 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
4f90: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
4fa0: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
4fb0: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
4fc0: 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
4fd0: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
4fe0: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
4ff0: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
5000: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
5010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5020: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
5030: 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65  l with index iCe
5040: 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
5050: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
5060: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
5070: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
5080: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
5090: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
50a0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
50b0: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
50c0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
50d0: 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a  utOvfl(MemPage *
50e0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
50f0: 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  ){.  u8 *pCell;.
5100: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5110: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
5120: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
5130: 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  );.  pCell = fin
5140: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
5150: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72  age, iCell);.  r
5160: 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f  eturn ptrmapPutO
5170: 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
5180: 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ell);.}.#endif..
5190: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
51a0: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
51b0: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
51c0: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
51d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
51e0: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
51f0: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
5200: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
5210: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
5220: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
5230: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
5240: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
5250: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
5260: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
5270: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
5280: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
5290: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
52a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
52b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
52c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
52d0: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
52e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
52f0: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
5300: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64  cell */.  int ad
5310: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
5320: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
5330: 66 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  f first byte aft
5340: 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  er cell pointer 
5350: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68  array */.  int h
5360: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
5370: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
5380: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
5390: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
53a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
53b0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
53c0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
53d0: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
53e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
53f0: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
5400: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
5410: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
5420: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
5430: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
5440: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
5450: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5470: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
5480: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
5490: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
54c0: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
54d0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
54e0: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
54f0: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
5500: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
5510: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
5520: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
5530: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
5540: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
5550: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
5560: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
5570: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
5580: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
5590: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
55a0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
55b0: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
55c0: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
55d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
55e0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
55f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5600: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
5610: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
5620: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
5630: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
5640: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
5650: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
5660: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
5670: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
5680: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
5690: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
56a0: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
56b0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
56c0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
56d0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
56e0: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
56f0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
5700: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5710: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
5720: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
5730: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
5740: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
5750: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
5760: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
5770: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
5780: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
5790: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
57a0: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
57b0: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
57c0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
57d0: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
57e0: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
57f0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
5800: 70 41 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20  pAddr);.    if( 
5810: 70 63 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  pc>=usableSize )
5820: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
5830: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
5840: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 69  PT;.    }.    si
5850: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
5860: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
5870: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
5880: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62  size;.    if( cb
5890: 72 6b 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  rk<cellOffset+2*
58a0: 6e 43 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a 65  nCell || pc+size
58b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
58c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
58d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
58e0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
58f0: 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73  t( cbrk+size<=us
5900: 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b  ableSize && cbrk
5910: 3e 3d 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  >=0 );.    memcp
5920: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
5930: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
5940: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
5950: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
5960: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
5970: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
5980: 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ll );.  put2byte
5990: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
59a0: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
59b0: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
59c0: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
59d0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
59e0: 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73   addr = cellOffs
59f0: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65  et+2*nCell;.  me
5a00: 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d  mset(&data[addr]
5a10: 2c 20 30 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b  , 0, cbrk-addr);
5a20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5a30: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
5a40: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
5a50: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
5a60: 2d 61 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e 46  -addr!=pPage->nF
5a70: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
5a80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
5a90: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
5aa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5ab0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
5ac0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
5ad0: 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e  space on a page.
5ae0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
5af0: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
5b00: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74  ge->aData[] of t
5b10: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
5b20: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f  .** the new allo
5b30: 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61 6c  cation.  The cal
5b40: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
5b50: 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f  hat there is eno
5b60: 75 67 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20 54  ugh.** space.  T
5b70: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
5b80: 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a   never fail..**.
5b90: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  ** If the page c
5ba0: 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f  ontains nBytes o
5bb0: 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74  f free space but
5bc0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
5bd0: 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63  n.** nBytes of c
5be0: 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73  ontiguous free s
5bf0: 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20  pace, then this 
5c00: 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69  routine automati
5c10: 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64  cally.** calls d
5c20: 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29  efragementPage()
5c30: 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20   to consolidate 
5c40: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62  all free space b
5c50: 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  efore .** alloca
5c60: 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75  ting the new chu
5c70: 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nk..*/.static in
5c80: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
5c90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
5ca0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e  int nByte){.  in
5cb0: 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b  t addr, pc, hdr;
5cc0: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69  .  int size;.  i
5cd0: 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20  nt nFrag;.  int 
5ce0: 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  top;.  int nCell
5cf0: 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  ;.  int cellOffs
5d00: 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  et;.  unsigned c
5d10: 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20  har *data;.  .  
5d20: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
5d30: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ata;.  assert( s
5d40: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
5d50: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
5d60: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
5d70: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
5d80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5d90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5da0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
5db0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
5dc0: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
5dd0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
5de0: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
5df0: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
5e00: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
5e10: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
5e20: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50 61  flow==0 );.  pPa
5e30: 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31  ge->nFree -= (u1
5e40: 36 29 6e 42 79 74 65 3b 0a 20 20 68 64 72 20 3d  6)nByte;.  hdr =
5e50: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
5e60: 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61  t;..  nFrag = da
5e70: 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28  ta[hdr+7];.  if(
5e80: 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20 20   nFrag<60 ){.   
5e90: 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66   /* Search the f
5ea0: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
5eb0: 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65  for a slot big e
5ec0: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
5ed0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61 63   the.    ** spac
5ee0: 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20  e request. */.  
5ef0: 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a    addr = hdr+1;.
5f00: 20 20 20 20 77 68 69 6c 65 28 20 28 70 63 20 3d      while( (pc =
5f10: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5f20: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
5f30: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
5f40: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
5f50: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
5f60: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
5f70: 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d    int x = size -
5f80: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
5f90: 69 66 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34  if( size<nByte+4
5fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
5fb0: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
5fc0: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
5fd0: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
5fe0: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
5ff0: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
6000: 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b 0a 20      return pc;. 
6010: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6020: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
6030: 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  (&data[pc+2], x)
6040: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
6050: 72 6e 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20  rn pc + x;.     
6060: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6070: 20 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20     addr = pc;.  
6080: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
6090: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
60a0: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
60b0: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
60c0: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
60d0: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
60e0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a  ontent area..  *
60f0: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
6100: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
6110: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ;.  nCell = get2
6120: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
6130: 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  ]);.  cellOffset
6140: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
6150: 66 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61  fset;.  if( nFra
6160: 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66  g>=60 || cellOff
6170: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20  set + 2*nCell > 
6180: 74 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20  top - nByte ){. 
6190: 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67     defragmentPag
61a0: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 74 6f  e(pPage);.    to
61b0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
61c0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a  ta[hdr+5]);.  }.
61d0: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
61e0: 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66    assert( cellOf
61f0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c  fset + 2*nCell <
6200: 3d 20 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62  = top );.  put2b
6210: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
6220: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
6230: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
6240: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
6250: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
6260: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
6270: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
6280: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
6290: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
62a0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
62b0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
62c0: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
62d0: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
62e0: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
62f0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6300: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
6310: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
6320: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
6330: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
6340: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
6350: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
6360: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
6370: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
6380: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
6390: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
63a0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
63b0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
63c0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
63d0: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73  egin, hdr;.  uns
63e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
63f0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
6400: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
6410: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
6420: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
6430: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
6440: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
6450: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
6460: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
6470: 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
6480: 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73  af?0:4) );.  ass
6490: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
64a0: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
64b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
64c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
64d0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
64e0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
64f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
6500: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
6510: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
6520: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
6530: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
6540: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
6550: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
6560: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
6570: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
6580: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
6590: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
65a0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
65b0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
65c0: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
65d0: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
65e0: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
65f0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
6600: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
6610: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20  blocks */.  hdr 
6620: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
6630: 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72  et;.  addr = hdr
6640: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
6650: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
6660: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c  e(&data[addr]))<
6670: 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e  start && pbegin>
6680: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6690: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
66a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
66b0: 34 20 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  4 );.    if( pbe
66c0: 67 69 6e 3c 3d 61 64 64 72 20 29 20 7b 0a 20 20  gin<=addr ) {.  
66d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
66e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
66f0: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d      }.    addr =
6700: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69   pbegin;.  }.  i
6710: 66 20 28 20 70 62 65 67 69 6e 3e 70 50 61 67 65  f ( pbegin>pPage
6720: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
6730: 65 2d 34 20 29 20 7b 0a 20 20 20 20 72 65 74 75  e-4 ) {.    retu
6740: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6750: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
6760: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
6770: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
6780: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
6790: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
67a0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
67b0: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
67c0: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
67d0: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
67e0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
67f0: 46 72 65 65 20 2b 3d 20 28 75 31 36 29 73 69 7a  Free += (u16)siz
6800: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
6810: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
6820: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
6830: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
6840: 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  set + 1;.  while
6850: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
6860: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
6870: 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ))>0 ){.    int 
6880: 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b  pnext, psize, x;
6890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
68a0: 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20  gin>addr );.    
68b0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
68c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
68d0: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
68e0: 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65  pnext = get2byte
68f0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b  (&data[pbegin]);
6900: 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74  .    psize = get
6910: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
6920: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  in+2]);.    if( 
6930: 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b  pbegin + psize +
6940: 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70   3 >= pnext && p
6950: 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  next>0 ){.      
6960: 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74  int frag = pnext
6970: 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65   - (pbegin+psize
6980: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72  );.      if( (fr
6990: 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28  ag<0) || (frag>(
69a0: 69 6e 74 29 64 61 74 61 5b 70 50 61 67 65 2d 3e  int)data[pPage->
69b0: 68 64 72 4f 66 66 73 65 74 2b 37 5d 29 20 29 7b  hdrOffset+7]) ){
69c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
69d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
69e0: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
69f0: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
6a00: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 28  drOffset+7] -= (
6a10: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
6a20: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6a30: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
6a40: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
6a50: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
6a60: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
6a70: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
6a80: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
6a90: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
6aa0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
6ab0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
6ac0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
6ad0: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
6ae0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
6af0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
6b00: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
6b10: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
6b20: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
6b30: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
6b40: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
6b50: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
6b60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
6b70: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
6b80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
6b90: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
6ba0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
6bb0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
6bc0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
6bd0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
6be0: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
6bf0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
6c00: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
6c10: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
6c20: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
6c30: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
6c40: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
6c50: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
6c60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6c70: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
6c80: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
6c90: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
6ca0: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
6cb0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
6cc0: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
6cd0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
6ce0: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
6cf0: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
6d00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
6d10: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
6d20: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
6d30: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
6d40: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
6d50: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
6d60: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
6d70: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
6d80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6d90: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
6da0: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
6db0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
6dc0: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
6dd0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
6de0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
6df0: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
6e00: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
6e10: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
6e20: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
6e30: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
6e40: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
6e50: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
6e60: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
6e70: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
6e80: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
6e90: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
6ea0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6eb0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6ec0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6ed0: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
6ee0: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
6ef0: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
6f00: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
6f10: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
6f20: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
6f30: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
6f40: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
6f50: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
6f60: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
6f70: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
6f80: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
6f90: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
6fa0: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
6fb0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
6fc0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
6fd0: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
6fe0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
6ff0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
7000: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
7010: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
7020: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
7030: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
7040: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
7050: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
7060: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
7070: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
7080: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
7090: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
70a0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
70b0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
70c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
70d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
70e0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
70f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
7100: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
7110: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
7120: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
7130: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
7140: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
7150: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
7160: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
7170: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
7180: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
7190: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
71a0: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
71b0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
71c0: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
71d0: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
71e0: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
71f0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
7200: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
7210: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
7220: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
7230: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
7240: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
7250: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
7260: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d  3BtreeInitPage(M
7270: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
7280: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7290: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
72a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
72b0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
72c0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
72d0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
72e0: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
72f0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
7300: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
7310: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
7320: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
7330: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
7340: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
7350: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
7360: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
7370: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
7380: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
7390: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
73a0: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
73c0: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
73d0: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
73e0: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
73f0: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
7400: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7410: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
7420: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
7430: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
7440: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
7450: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
7460: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
7470: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
7480: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
7490: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75  ructure */.    u
74a0: 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  16 usableSize;  
74b0: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
74c0: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
74d0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
74e0: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
74f0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
7500: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
7510: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
7520: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  inter */.    u16
7530: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
7540: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
7550: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
7560: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
7570: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
7580: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
7590: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
75a0: 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 20 20 70  t area */..    p
75b0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
75c0: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
75d0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
75e0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
75f0: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
7600: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
7610: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
7620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7630: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
7640: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
7650: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
7660: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36  ->pageSize<=3276
7670: 38 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  8 );.    pPage->
7680: 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e  maskPage = pBt->
7690: 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20  pageSize - 1;.  
76a0: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
76b0: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
76c0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
76d0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
76e0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
76f0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
7700: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
7710: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70  e->leaf;.    top
7720: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
7730: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
7740: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
7750: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7760: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
7770: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
7780: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
7790: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
77a0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
77b0: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
77c0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
77d0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
77e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
77f0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  PT;.    }.  .   
7800: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
7810: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
7820: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
7830: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
7840: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
7850: 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74  .    nFree = dat
7860: 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d  a[hdr+7] + top -
7870: 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32   (cellOffset + 2
7880: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a  *pPage->nCell);.
7890: 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20      while( pc>0 
78a0: 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78  ){.      u16 nex
78b0: 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  t, size;.      i
78c0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
78d0: 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  -4 ){.        /*
78e0: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
78f0: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
7900: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
7910: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7920: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
7930: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
7940: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
7950: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
7960: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
7970: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
7980: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
7990: 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20  ize+3 ){.       
79a0: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
79b0: 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e  must be in accen
79c0: 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
79d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
79e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
79f0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
7a00: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
7a10: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
7a20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
7a30: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 6e  ->nFree = (u16)n
7a40: 46 72 65 65 3b 0a 20 20 20 20 69 66 28 20 6e 46  Free;.    if( nF
7a50: 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  ree>=usableSize 
7a60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
7a70: 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78   space cannot ex
7a80: 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20  ceed total page 
7a90: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  size */.      re
7aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7ab0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
7ac0: 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43 68 65  ..#if 0.  /* Che
7ad0: 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20  ck that all the 
7ae0: 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65 20 63  offsets in the c
7af0: 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79  ell offset array
7b00: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
7b10: 65 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  e. .  ** .  ** O
7b20: 6d 69 74 74 69 6e 67 20 74 68 69 73 20 63 6f 6e  mitting this con
7b30: 73 69 73 74 65 6e 63 79 20 63 68 65 63 6b 20 61  sistency check a
7b40: 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70 50 61  nd using the pPa
7b50: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73  ge->maskPage mas
7b60: 6b 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e  k.  ** to preven
7b70: 74 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20 74 68  t overrunning th
7b80: 65 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e  e page buffer in
7b90: 20 66 69 6e 64 43 65 6c 6c 28 29 20 72 65 73 75   findCell() resu
7ba0: 6c 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e  lts in a.  ** 2.
7bb0: 35 25 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67  5% performance g
7bc0: 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ain..  */.  {.  
7bd0: 20 20 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20    u8 *pOff;     
7be0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75     /* Iterator u
7bf0: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c  sed to check all
7c00: 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72   cell offsets ar
7c10: 65 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20  e in range */.  
7c20: 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20    u8 *pEnd;     
7c30: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7c40: 20 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66   end of cell off
7c50: 73 65 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  set array */.   
7c60: 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20   u8 mask;       
7c70: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
7c80: 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a  s that must be z
7c90: 65 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65  ero in MSB of ce
7ca0: 6c 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20  ll offsets */.  
7cb0: 20 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75 38 29    mask = ~(((u8)
7cc0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
7cd0: 38 29 29 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64  8))-1);.    pEnd
7ce0: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
7cf0: 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65  set + pPage->nCe
7d00: 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70  ll*2];.    for(p
7d10: 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66  Off=&data[cellOf
7d20: 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e  fset]; pOff!=pEn
7d30: 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d  d && !((*pOff)&m
7d40: 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a  ask); pOff+=2);.
7d50: 20 20 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45      if( pOff!=pE
7d60: 6e 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  nd ){.      retu
7d70: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7d80: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
7d90: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 50  }.#endif..    pP
7da0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
7db0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7dc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
7dd0: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
7de0: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
7df0: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
7e00: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
7e10: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
7e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7e30: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
7e40: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
7e50: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
7e60: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
7e70: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
7e80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
7e90: 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
7ea0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
7eb0: 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
7ec0: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
7ed0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
7ee0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
7ef0: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
7f00: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
7f10: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
7f20: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
7f30: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
7f40: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
7f50: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7f60: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
7f70: 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
7f80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7f90: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
7fa0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
7fb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
7fc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7fd0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
7fe0: 0a 20 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74  .  /*memset(&dat
7ff0: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
8000: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
8010: 29 3b 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d  );*/.  data[hdr]
8020: 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a   = (char)flags;.
8030: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
8040: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
8050: 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29  F_LEAF)==0 ?1:0)
8060: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
8070: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
8080: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
8090: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
80a0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
80b0: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
80c0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
80d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
80e0: 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65   first;.  decode
80f0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
8100: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
8110: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
8120: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
8130: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
8140: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
8150: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
8160: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
8170: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
8180: 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50  e<=32768 );.  pP
8190: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
81a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
81b0: 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  1;.  pPage->nCel
81c0: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
81d0: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
81e0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
81f0: 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
8200: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
8210: 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
8220: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
8230: 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
8240: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
8250: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
8260: 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
8270: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
8280: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
8290: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
82a0: 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
82b0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
82c0: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
82d0: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
82e0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
82f0: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
8300: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
8310: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
8320: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
8330: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
8340: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
8350: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
8360: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72  1 ? 100 : 0;.  r
8370: 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
8380: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
8390: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
83a0: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
83b0: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
83c0: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
83d0: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
83e0: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eeded..**.** If 
83f0: 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
8400: 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
8410: 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
8420: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a  ot care about.**
8430: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
8440: 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
8450: 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
8460: 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
8470: 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
8480: 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
8490: 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
84a0: 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
84b0: 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
84c0: 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
84d0: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
84e0: 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
84f0: 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
8500: 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
8510: 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
8520: 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
8530: 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
8540: 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
8550: 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
8560: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
8570: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 0a 20  3BtreeGetPage(. 
8580: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
8590: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
85a0: 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
85b0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
85c0: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
85d0: 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
85e0: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
85f0: 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
8600: 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
8610: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
8620: 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
8630: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c       /* Do not l
8640: 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
8650: 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
8660: 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
8670: 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
8680: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8690: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
86a0: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
86b0: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
86c0: 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
86d0: 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
86e0: 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e  )&pDbPage, noCon
86f0: 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20  tent);.  if( rc 
8700: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
8710: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
8720: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
8730: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
8740: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8750: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
8760: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
8770: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
8780: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
8790: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
87a0: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
87b0: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
87c0: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
87d0: 61 74 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50  atic Pgno pagerP
87e0: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
87f0: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e  d *pBt){.  int n
8800: 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  Page = -1;.  int
8810: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
8820: 42 74 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20  Bt->pPage1 );.  
8830: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8840: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
8850: 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
8860: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
8870: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67  QLITE_OK || nPag
8880: 65 3d 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72  e==-1 );.  retur
8890: 6e 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d  n (Pgno)nPage;.}
88a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
88b0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
88c0: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
88d0: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
88e0: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
88f0: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
8900: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
8910: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
8920: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
8930: 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  age() and sqlite
8940: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
8950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8960: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
8970: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
8980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
8990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
89a0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
89b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
89c0: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
89d0: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
89e0: 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  ge **ppPage     
89f0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
8a00: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
8a10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
8a20: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
8a30: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
8a40: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
8a50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8a60: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
8a70: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
8a80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8a90: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8aa0: 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20  ; .  }..  /* It 
8ab0: 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63 61 73  is often the cas
8ac0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
8ad0: 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72 65 61  we want is alrea
8ae0: 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20 20 2a  dy in cache..  *
8af0: 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69 74 20  * If so, get it 
8b00: 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
8b10: 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20 68 61  saves us from ha
8b20: 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20 20 2a  ving to call.  *
8b30: 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  * pagerPagecount
8b40: 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  () to make sure 
8b50: 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e 20 6c  pgno is within l
8b60: 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72 65 73  imits, which res
8b70: 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61 20 6d  ults.  ** in a m
8b80: 65 61 73 75 72 65 61 62 6c 65 20 70 65 72 66 6f  easureable perfo
8b90: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
8ba0: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 44 62 50  nts..  */.  pDbP
8bb0: 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
8bc0: 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
8bd0: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
8be0: 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
8bf0: 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61 6c 72    /* Page is alr
8c00: 65 61 64 79 20 69 6e 20 63 61 63 68 65 20 2a 2f  eady in cache */
8c10: 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
8c20: 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
8c30: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
8c40: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
8c50: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8c60: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
8c70: 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e 20   /* Page not in 
8c80: 63 61 63 68 65 2e 20 20 41 63 71 75 69 72 65 20  cache.  Acquire 
8c90: 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
8ca0: 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
8cb0: 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
8cc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8cd0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
8ce0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
8cf0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
8d00: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
8d10: 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
8d20: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
8d30: 20 20 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50      pPage = *ppP
8d40: 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  age;.  }.  if( !
8d50: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
8d60: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8d70: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
8d80: 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Page);.  }.  if(
8d90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8da0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
8db0: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  e(pPage);.    *p
8dc0: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
8dd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8de0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
8df0: 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
8e00: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
8e10: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
8e20: 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  or.** call to sq
8e30: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
8e40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
8e50: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
8e60: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
8e70: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
8e80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8e90: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
8ea0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
8eb0: 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d  eRefcount(pPage-
8ec0: 3e 70 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20  >pDbPage)>1 );. 
8ed0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8ee0: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
8ef0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
8f00: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
8f10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
8f20: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
8f30: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
8f40: 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73  pPage );.    ass
8f50: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
8f60: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
8f70: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
8f80: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
8f90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8fa0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8fb0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8fc0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
8fd0: 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  nref(pPage->pDbP
8fe0: 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
8ff0: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
9000: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
9010: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
9020: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
9030: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
9040: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
9050: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
9060: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
9070: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
9080: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
9090: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
90a0: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
90b0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
90c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
90d0: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
90e0: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
90f0: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
9100: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
9110: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
9120: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
9130: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
9140: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
9150: 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
9160: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9170: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
9180: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
9190: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
91a0: 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  a);.  if( pPage-
91b0: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
91c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
91d0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
91e0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
91f0: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
9200: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
9210: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
9220: 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
9230: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9240: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
9250: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
9260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
9270: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
9280: 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
9290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
92a0: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
92b0: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
92c0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
92d0: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
92e0: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
92f0: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
9300: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9310: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
9320: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
9330: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
9340: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
9350: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
9360: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
9370: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
9380: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
9390: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
93a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
93b0: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
93c0: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20  me is NULL.** a 
93d0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74  new database wit
93e0: 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20  h a random name 
93f0: 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69  is created.  Thi
9400: 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64  s randomly named
9410: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
9420: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
9430: 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  d when sqlite3Bt
9440: 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
9450: 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  lled..** If zFil
9460: 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
9470: 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d  y:" then an in-m
9480: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
9490: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61  s created.** tha
94a0: 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
94b0: 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65  ly destroyed whe
94c0: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
94d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
94e0: 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  reeOpen(.  const
94f0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
9500: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
9510: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
9520: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
9530: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
9540: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
9550: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
9560: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
9570: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
9580: 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
9590: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
95a0: 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
95b0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
95c0: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
95d0: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
95e0: 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
95f0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
9600: 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
9610: 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
9620: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
9630: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
9640: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20   *pVfs;      /* 
9650: 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66  The VFS to use f
9660: 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  or this btree */
9670: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
9680: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 68   = 0;      /* Sh
9690: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
96a0: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
96b0: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
96c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
96d0: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
96e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
96f0: 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 6e 52 65 73  TE_OK;.  u8 nRes
9700: 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  erve;.  unsigned
9710: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
9720: 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  100];..  /* Set 
9730: 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
9740: 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
9750: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
9760: 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
9770: 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
9780: 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
9790: 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73  . This symbol is
97a0: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69   only required i
97b0: 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66  f.  ** either of
97c0: 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74 61   the shared-data
97d0: 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66   or autovacuum f
97e0: 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70  eatures are comp
97f0: 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20  iled .  ** into 
9800: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a  the library..  *
9810: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
9820: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
9830: 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66  D_CACHE) || !def
9840: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9850: 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23  _AUTOVACUUM).  #
9860: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
9870: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63  T_MEMORYDB.    c
9880: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
9890: 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20   = 0;.  #else.  
98a0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
98b0: 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20  mdb = zFilename 
98c0: 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65  && !strcmp(zFile
98d0: 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
98e0: 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64  );.  #endif.#end
98f0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
9900: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
9910: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9920: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
9930: 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d 3e  ;..  pVfs = db->
9940: 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69  pVfs;.  p = sqli
9950: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
9960: 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
9970: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
9980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9990: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  M;.  }.  p->inTr
99a0: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
99b0: 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
99c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
99d0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
99e0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
99f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9a00: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
9a10: 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
9a20: 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
9a30: 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
9a40: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
9a50: 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
9a60: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
9a70: 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
9a80: 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
9a90: 69 73 4d 65 6d 64 62 3d 3d 30 0a 20 20 20 26 26  isMemdb==0.   &&
9aa0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
9ab0: 4c 49 54 45 5f 56 74 61 62 29 3d 3d 30 0a 20 20  LITE_Vtab)==0.  
9ac0: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26   && zFilename &&
9ad0: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 0a 20 20   zFilename[0].  
9ae0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
9af0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
9b00: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
9b10: 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  d ){.      int n
9b20: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
9b30: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
9b40: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
9b50: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
9b60: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
9b70: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
9b80: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
9b90: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20   *mutexShared;. 
9ba0: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
9bb0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e   = 1;.      db->
9bc0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
9bd0: 53 68 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20  SharedCache;.   
9be0: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
9bf0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
9c00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9c10: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9c20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9c40: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
9c50: 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
9c60: 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  me, nFullPathnam
9c70: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
9c80: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
9c90: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
9ca0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
9cb0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
9cc0: 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
9cd0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
9ce0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
9cf0: 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
9d00: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
9d10: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
9d20: 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
9d30: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
9d40: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
9d50: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
9d60: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
9d70: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
9d80: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
9d90: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
9da0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
9db0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
9dc0: 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
9dd0: 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
9de0: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
9df0: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
9e00: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
9e10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9e30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
9e40: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
9e50: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
9e60: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
9e70: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
9e80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9e90: 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
9ea0: 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
9eb0: 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
9ec0: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
9ed0: 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
9ee0: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
9ef0: 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
9f00: 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
9f10: 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
9f20: 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
9f30: 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
9f40: 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
9f50: 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
9f60: 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
9f70: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
9f80: 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
9f90: 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
9fa0: 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
9fb0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
9fc0: 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
9fd0: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
9fe0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
9ff0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
a000: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
a010: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
a020: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
a030: 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
a040: 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
a050: 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
a060: 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
a070: 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
a080: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
a090: 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
a0a0: 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
a0b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
a0c0: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
a0d0: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
a0e0: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
a0f0: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
a100: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36  ==8 || sizeof(u6
a110: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
a120: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29  ert( sizeof(u32)
a130: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
a140: 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
a150: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
a160: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
a170: 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d   );.  .    pBt =
a180: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
a190: 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  ro( sizeof(*pBt)
a1a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d   );.    if( pBt=
a1b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
a1c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a1d0: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
a1e0: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
a1f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a200: 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
a210: 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
a220: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66     EXTRA_SIZE, f
a250: 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b  lags, vfsFlags);
a260: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
a270: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a280: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
a290: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
a2a0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
a2b0: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
a2c0: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
a2d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a2e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
a2f0: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
a300: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ut;.    }.    sq
a310: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
a320: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
a330: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
a340: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
a350: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
a360: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c   pBt;.  .    sql
a370: 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
a380: 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  iter(pBt->pPager
a390: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
a3a0: 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
a3b0: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
a3c0: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
a3d0: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71  t->readOnly = sq
a3e0: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
a3f0: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
a400: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
a410: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
a420: 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b  &zDbHeader[16]);
a430: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
a440: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
a450: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
a460: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
a470: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
a480: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
a490: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
a4a0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
a4b0: 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20  pageSize = 0;.  
a4c0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
a4d0: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
a4e0: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
a4f0: 61 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e 64 65  ageSize);.#ifnde
a500: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
a510: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
a520: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
a530: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
a540: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
a550: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
a560: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
a570: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
a580: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
a590: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
a5a0: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
a5b0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
a5c0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
a5d0: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
a5e0: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
a5f0: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
a600: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
a610: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
a620: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
a630: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
a640: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
a650: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
a660: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
a670: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
a680: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
a690: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
a6a0: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
a6b0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
a6c0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
a6d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
a6e0: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
a6f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
a700: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
a710: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
a720: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
a730: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
a740: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
a750: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
a760: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
a770: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
a780: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  0];.      pBt->p
a790: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
a7a0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
a7b0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
a7c0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
a7d0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
a7e0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
a7f0: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
a800: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
a810: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
a820: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
a830: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
a840: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  dif.    }.    pB
a850: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
a860: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
a870: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
a880: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
a890: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
a8a0: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
a8b0: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
a8c0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
a8d0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
a8e0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
a8f0: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
a900: 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
a910: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
a920: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
a930: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a940: 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20  _DISKIO).    /* 
a950: 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68  Add the new BtSh
a960: 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74  ared object to t
a970: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
a980: 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64  harable BtShared
a990: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
a9a0: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
a9b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
a9c0: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
a9d0: 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52  d;.      pBt->nR
a9e0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75  ef = 1;.      mu
a9f0: 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
aa00: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
aa10: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
aa20: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
aa30: 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
aa40: 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
aa50: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
aa60: 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
aa70: 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
aa80: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
aa90: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
aaa0: 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
aab0: 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
aac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
aad0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
aae0: 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  .          db->m
aaf0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b  allocFailed = 0;
ab00: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ab10: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
ab20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ab30: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
ab40: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
ab50: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
ab60: 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f  pBt->pNext = GLO
ab70: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
ab80: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
ab90: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f  List);.      GLO
aba0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
abb0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
abc0: 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20  List) = pBt;.   
abd0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
abe0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
abf0: 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ed);.    }.#endi
ac00: 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69  f.  }..#if !defi
ac10: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ac20: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
ac30: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ac40: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
ac50: 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74  /* If the new Bt
ac60: 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61  ree uses a shara
ac70: 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74  ble pBtShared, t
ac80: 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77  hen link the new
ac90: 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f  .  ** Btree into
aca0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
acb0: 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73   sharable Btrees
acc0: 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f   for the same co
acd0: 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nnection..  ** T
ace0: 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20  he list is kept 
acf0: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
ad00: 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73  er by pBt addres
ad10: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
ad20: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
ad30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65   int i;.    Btre
ad40: 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72  e *pSib;.    for
ad50: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
ad60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
ad70: 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62   (pSib = db->aDb
ad80: 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70  [i].pBt)!=0 && p
ad90: 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  Sib->sharable ){
ada0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
adb0: 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70  pSib->pPrev ){ p
adc0: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65  Sib = pSib->pPre
add0: 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  v; }.        if(
ade0: 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42   p->pBt<pSib->pB
adf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
ae00: 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
ae10: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
ae20: 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
ae30: 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
ae40: 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
ae50: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
ae60: 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
ae70: 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  & pSib->pNext->p
ae80: 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  Bt<p->pBt ){.   
ae90: 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
aea0: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
aeb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
aec0: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
aed0: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
aee0: 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
aef0: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
af00: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
af10: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
af20: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
af30: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
af40: 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
af50: 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
af60: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
af70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
af80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
af90: 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
afa0: 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
afb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
afc0: 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
afd0: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
afe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
aff0: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
b000: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
b010: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
b020: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
b030: 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
b040: 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tree = 0;.  }.  
b050: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b060: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
b070: 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
b080: 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
b090: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
b0a0: 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
b0b0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
b0c0: 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
b0d0: 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
b0e0: 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
b0f0: 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
b100: 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
b110: 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
b120: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
b130: 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
b140: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
b150: 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
b160: 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
b170: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
b180: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
b190: 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  CHE.  sqlite3_mu
b1a0: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  tex *pMaster;.  
b1b0: 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
b1c0: 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
b1d0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
b1e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
b1f0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
b200: 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   );.  pMaster = 
b210: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
b220: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
b230: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
b240: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
b250: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
b260: 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
b270: 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
b280: 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
b290: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
b2a0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
b2b0: 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
b2c0: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
b2d0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
b2e0: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
b2f0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
b300: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
b310: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
b320: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
b330: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
b340: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
b350: 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
b360: 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
b370: 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
b380: 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
b390: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
b3a0: 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
b3b0: 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
b3c0: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
b3d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b3e0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
b3f0: 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
b400: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
b410: 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
b420: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
b430: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
b440: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
b450: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
b460: 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
b470: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
b480: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
b490: 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
b4a0: 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
b4b0: 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
b4c0: 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
b4d0: 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
b4e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
b4f0: 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
b500: 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
b510: 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
b520: 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
b530: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
b540: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
b550: 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
b560: 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ze );.  }.}../*.
b570: 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
b580: 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
b590: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
b5a0: 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
b5b0: 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
b5c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
b5d0: 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
b5e0: 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
b5f0: 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
b600: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
b610: 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
b620: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
b630: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
b640: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
b650: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
b660: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
b670: 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
b680: 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
b690: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
b6a0: 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
b6b0: 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
b6c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b6d0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
b6e0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
b6f0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
b700: 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
b710: 2d 3e 64 62 3b 0a 20 20 70 43 75 72 20 3d 20 70  ->db;.  pCur = p
b720: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
b730: 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
b740: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
b750: 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
b760: 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
b770: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
b780: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
b790: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
b7a0: 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
b7b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
b7c0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
b7d0: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
b7e0: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
b7f0: 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
b800: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
b810: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
b820: 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
b830: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
b840: 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
b850: 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
b860: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
b870: 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ack(p);.  sqlite
b880: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
b890: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
b8a0: 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
b8b0: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
b8c0: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
b8d0: 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
b8e0: 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
b8f0: 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
b900: 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
b910: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
b920: 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
b930: 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
b940: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
b950: 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
b960: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
b970: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
b980: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
b990: 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
b9a0: 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
b9b0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
b9c0: 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
b9d0: 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
b9e0: 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
b9f0: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
ba00: 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
ba10: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
ba20: 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
ba30: 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
ba40: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
ba50: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
ba60: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
ba70: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
ba80: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
ba90: 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
baa0: 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
bab0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
bac0: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
bad0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
bae0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
baf0: 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65  _free(pBt->pSche
bb00: 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
bb10: 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
bb20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
bb30: 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
bb40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
bb50: 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
bb60: 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
bb70: 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
bb80: 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
bb90: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
bba0: 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
bbb0: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
bbc0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
bbd0: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
bbe0: 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
bbf0: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
bc00: 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
bc10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
bc20: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
bc30: 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
bc40: 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
bc50: 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
bc60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
bc70: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
bc80: 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
bc90: 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
bca0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
bcb0: 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
bcc0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
bcd0: 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
bce0: 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
bcf0: 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
bd00: 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
bd10: 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
bd20: 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
bd30: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
bd40: 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
bd50: 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
bd60: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
bd70: 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
bd80: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
bd90: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
bda0: 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
bdb0: 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
bdc0: 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
bdd0: 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
bde0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
bdf0: 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
be00: 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
be10: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
be20: 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
be30: 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
be40: 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
be50: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
be60: 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
be70: 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
be80: 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
be90: 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
bea0: 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
beb0: 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
bec0: 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
bed0: 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
bee0: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
bef0: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
bf00: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
bf10: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
bf20: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
bf30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
bf40: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
bf50: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
bf60: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
bf70: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
bf80: 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
bf90: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
bfa0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
bfb0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
bfc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
bfd0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
bfe0: 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
bff0: 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
c000: 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
c010: 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
c020: 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
c030: 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
c040: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
c050: 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
c060: 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
c070: 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
c080: 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
c090: 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
c0a0: 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
c0b0: 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
c0c0: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
c0d0: 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
c0e0: 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
c0f0: 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
c100: 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
c110: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
c120: 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
c130: 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
c140: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
c150: 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
c160: 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
c170: 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
c180: 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
c190: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
c1a0: 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
c1b0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53  sqlite3BtreeSetS
c1c0: 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65  afetyLevel(Btree
c1d0: 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20   *p, int level, 
c1e0: 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20  int fullSync){. 
c1f0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
c200: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
c210: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c220: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
c230: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
c240: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c250: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
c260: 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d  SafetyLevel(pBt-
c270: 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20  >pPager, level, 
c280: 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  fullSync);.  sql
c290: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
c2a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
c2b0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
c2c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
c2d0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
c2e0: 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
c2f0: 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
c300: 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
c310: 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
c320: 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
c330: 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
c340: 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
c350: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
c360: 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
c370: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
c380: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
c390: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
c3a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c3b0: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
c3c0: 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42   );  .  sqlite3B
c3d0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
c3e0: 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70  assert( pBt && p
c3f0: 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20  Bt->pPager );.  
c400: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
c410: 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
c420: 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ger);.  sqlite3B
c430: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c440: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
c450: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
c460: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
c470: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
c480: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
c490: 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  CUUM)./*.** Chan
c4a0: 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
c4b0: 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
c4c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
c4d0: 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
c4e0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
c4f0: 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
c500: 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
c510: 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
c520: 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
c530: 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
c540: 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
c550: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
c560: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
c570: 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
c580: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
c590: 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
c5a0: 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
c5b0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
c5c0: 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
c5d0: 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
c5e0: 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
c5f0: 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
c600: 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
c610: 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
c620: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
c630: 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
c640: 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
c650: 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
c660: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
c670: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
c680: 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
c690: 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
c6a0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
c6b0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
c6c0: 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
c6d0: 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
c6e0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
c6f0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
c700: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
c710: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
c720: 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
c730: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c740: 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
c750: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
c760: 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
c770: 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
c780: 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
c790: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
c7a0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
c7b0: 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20  SizeFixed ){.   
c7c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c7d0: 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
c7e0: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
c7f0: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
c800: 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
c810: 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
c820: 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
c830: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
c840: 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
c850: 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
c860: 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
c870: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
c880: 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
c890: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
c8a0: 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
c8b0: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
c8c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
c8d0: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
c8e0: 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
c8f0: 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65  ert( !pBt->pPage
c900: 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73  1 && !pBt->pCurs
c910: 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
c920: 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
c930: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
c940: 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
c950: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c960: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
c970: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
c980: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
c990: 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c    }.  pBt->usabl
c9a0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
c9b0: 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
c9c0: 73 65 72 76 65 3b 0a 20 20 73 71 6c 69 74 65 33  serve;.  sqlite3
c9d0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c9e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c9f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
ca00: 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
ca10: 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
ca20: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
ca30: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
ca40: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
ca50: 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
ca60: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
ca70: 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
ca80: 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
ca90: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
caa0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
cab0: 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
cac0: 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
cad0: 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
cae0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
caf0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
cb00: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
cb10: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
cb20: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
cb30: 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
cb40: 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
cb50: 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
cb60: 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
cb70: 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
cb80: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
cb90: 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
cba0: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
cbb0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
cbc0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
cbd0: 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
cbe0: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
cbf0: 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
cc00: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
cc10: 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
cc20: 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
cc30: 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
cc40: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
cc50: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
cc60: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
cc70: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
cc80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
cc90: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
cca0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
ccb0: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
ccc0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
ccd0: 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
cce0: 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
ccf0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
cd00: 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
cd10: 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
cd20: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
cd30: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
cd40: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
cd50: 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
cd60: 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
cd70: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
cd80: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
cd90: 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
cda0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
cdb0: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
cdc0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
cdd0: 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
cde0: 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
cdf0: 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
ce00: 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
ce10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
ce20: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
ce30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
ce40: 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
ce50: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
ce60: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
ce70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
ce80: 38 20 61 76 20 3d 20 61 75 74 6f 56 61 63 75 75  8 av = autoVacuu
ce90: 6d 20 3f 31 3a 30 3b 0a 0a 20 20 73 71 6c 69 74  m ?1:0;..  sqlit
cea0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
ceb0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
cec0: 53 69 7a 65 46 69 78 65 64 20 26 26 20 61 76 21  SizeFixed && av!
ced0: 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
cee0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
cef0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
cf00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
cf10: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b  autoVacuum = av;
cf20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
cf30: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
cf40: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
cf50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
cf60: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
cf70: 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
cf80: 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
cf90: 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
cfa0: 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
cfb0: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
cfc0: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
cfd0: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
cfe0: 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
cff0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
d000: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
d010: 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
d020: 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
d030: 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
d040: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
d050: 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
d060: 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
d070: 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
d080: 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
d090: 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
d0a0: 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
d0b0: 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
d0c0: 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
d0d0: 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
d0e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
d0f0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
d100: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
d110: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
d120: 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
d130: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
d140: 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
d150: 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
d160: 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
d170: 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
d180: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
d190: 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
d1a0: 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
d1b0: 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
d1c0: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
d1d0: 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
d1e0: 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
d1f0: 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
d200: 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
d210: 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
d220: 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
d230: 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
d240: 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
d250: 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
d260: 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
d270: 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
d280: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
d290: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
d2a0: 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e  *pPage1;.  int n
d2b0: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
d2c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d2d0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
d2e0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  );.  if( pBt->pP
d2f0: 61 67 65 31 20 29 20 72 65 74 75 72 6e 20 53 51  age1 ) return SQ
d300: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20  LITE_OK;.  rc = 
d310: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
d320: 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
d330: 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
d340: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
d350: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
d360: 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
d370: 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
d380: 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
d390: 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
d3a0: 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
d3b0: 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
d3c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
d3d0: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
d3e0: 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
d3f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d400: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
d410: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
d420: 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  led;.  }else if(
d430: 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
d440: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  int pageSize;.  
d450: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
d460: 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
d470: 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
d480: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d490: 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28  _NOTADB;.    if(
d4a0: 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
d4b0: 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
d4c0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
d4d0: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
d4e0: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
d4f0: 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
d500: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61  {.      pBt->rea
d510: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  dOnly = 1;.    }
d520: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
d530: 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
d540: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
d550: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
d560: 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
d570: 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
d580: 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  n must be exactl
d590: 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20  y 25%.  And the 
d5a0: 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65  minimum.    ** e
d5b0: 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
d5c0: 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66   must be 12.5% f
d5d0: 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74  or both leaf-dat
d5e0: 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64  a and non-leaf-d
d5f0: 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ata..    ** The 
d600: 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
d610: 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
d620: 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
d630: 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
d640: 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
d650: 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
d660: 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
d670: 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
d680: 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
d690: 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
d6a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
d6b0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
d6c0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ed;.    }.    pa
d6d0: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
d6e0: 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20  e(&page1[16]);. 
d6f0: 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
d700: 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
d710: 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31  0 || pageSize<51
d720: 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51  2 ||.        (SQ
d730: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
d740: 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67 65  ZE<32768 && page
d750: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
d760: 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29  PAGE_SIZE).    )
d770: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
d780: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
d790: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
d7a0: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
d7b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
d7c0: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
d7d0: 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
d7e0: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d    if( pageSize!=
d7f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
d800: 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
d810: 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
d820: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
d830: 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
d840: 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
d850: 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
d860: 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
d870: 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
d880: 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
d890: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
d8a0: 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
d8b0: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
d8c0: 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
d8d0: 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
d8e0: 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
d8f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
d900: 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
d910: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
d920: 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
d930: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
d940: 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
d950: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
d960: 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
d970: 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
d980: 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61  eSize = (u16)usa
d990: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
d9a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
d9b0: 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
d9c0: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
d9d0: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71  e(pBt);.      sq
d9e0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
d9f0: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
da00: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
da10: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
da20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
da30: 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  }.    if( usable
da40: 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20  Size<500 ){.    
da50: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
da60: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
da70: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
da80: 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
da90: 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
daa0: 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73  leSize = (u16)us
dab0: 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
dac0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
dad0: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
dae0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
daf0: 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
db00: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
db10: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
db20: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
db30: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
db40: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
db50: 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
db60: 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
db70: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
db80: 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
db90: 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
dba0: 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
dbb0: 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
dbc0: 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
dbd0: 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
dbe0: 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
dbf0: 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
dc00: 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
dc10: 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
dc20: 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
dc30: 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
dc40: 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
dc50: 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
dc60: 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
dc70: 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
dc80: 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
dc90: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
dca0: 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
dcb0: 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
dcc0: 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
dcd0: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
dce0: 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
dcf0: 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
dd00: 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
dd10: 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
dd20: 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
dd30: 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
dd40: 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
dd50: 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
dd60: 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
dd70: 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
dd80: 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
dd90: 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
dda0: 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
ddb0: 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
ddc0: 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
ddd0: 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e  - 23;.  pBt->min
dde0: 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
ddf0: 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
de00: 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
de10: 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e  >maxLeaf = pBt->
de20: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b  usableSize - 35;
de30: 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20  .  pBt->minLeaf 
de40: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
de50: 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
de60: 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  23;.  assert( pB
de70: 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
de80: 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
de90: 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
dea0: 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
deb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dec0: 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
ded0: 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
dee0: 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
def0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
df00: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
df10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
df20: 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
df30: 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65  lockBtree() exce
df40: 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20  pt that it also 
df50: 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62  invokes the.** b
df60: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
df70: 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f  there is lock co
df80: 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ntention..*/.sta
df90: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
dfa0: 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65  eWithRetry(Btree
dfb0: 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72   *pRef){.  int r
dfc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
dfd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dfe0: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
dff0: 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20  (pRef) );.  if( 
e000: 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  pRef->inTrans==T
e010: 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
e020: 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f   u8 inTransactio
e030: 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69  n = pRef->pBt->i
e040: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
e050: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
e060: 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d  (pRef);.    rc =
e070: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
e080: 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29  inTrans(pRef, 0)
e090: 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d  ;.    pRef->pBt-
e0a0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
e0b0: 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a   inTransaction;.
e0c0: 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e      pRef->inTran
e0d0: 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
e0e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e0f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
e100: 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73  Ref->pBt->nTrans
e110: 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a  action--;.    }.
e120: 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
e130: 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20  ty(pRef);.  }.  
e140: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20  return rc;.}.   
e150: 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74      ../*.** If t
e160: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
e170: 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
e180: 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
e190: 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
e1a0: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
e1b0: 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
e1c0: 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
e1d0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
e1e0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
e1f0: 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
e200: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
e210: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
e220: 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
e230: 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
e240: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
e250: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
e260: 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69  re any outstandi
e270: 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73  ng cursors, this
e280: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e290: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
e2a0: 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
e2b0: 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
e2c0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
e2d0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
e2e0: 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
e2f0: 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
e300: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
e310: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e320: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
e330: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
e340: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
e350: 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
e360: 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  & pBt->pCursor==
e370: 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  0 && pBt->pPage1
e380: 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  !=0 ){.    if( s
e390: 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
e3a0: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
e3b0: 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73  >=1 ){.      ass
e3c0: 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
e3d0: 2d 3e 61 44 61 74 61 20 29 3b 0a 23 69 66 20 30  ->aData );.#if 0
e3e0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
e3f0: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30  pPage1->aData==0
e400: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
e410: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42 74  age *pPage = pBt
e420: 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20 20  ->pPage1;.      
e430: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
e440: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
e450: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
e460: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50  age);.        pP
e470: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
e480: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
e490: 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  gno = 1;.      }
e4a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
e4b0: 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70  leasePage(pBt->p
e4c0: 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
e4d0: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
e4e0: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  0;.    pBt->inSt
e4f0: 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  mt = 0;.  }.}../
e500: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
e510: 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  w database by in
e520: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
e530: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
e540: 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  .** file..*/.sta
e550: 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
e560: 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
e570: 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
e580: 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
e590: 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
e5a0: 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65   rc;.  int nPage
e5b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
e5c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e5d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
e5e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e5f0: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
e600: 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
e610: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e620: 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30  TE_OK || nPage>0
e630: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
e640: 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  c;.  }.  pP1 = p
e650: 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
e660: 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
e670: 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
e680: 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
e690: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
e6a0: 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
e6b0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
e6c0: 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
e6d0: 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
e6e0: 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
e6f0: 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
e700: 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
e710: 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70  ader)==16 );.  p
e720: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36  ut2byte(&data[16
e730: 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ], pBt->pageSize
e740: 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
e750: 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
e760: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
e770: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
e780: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
e790: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
e7a0: 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
e7b0: 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
e7c0: 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
e7d0: 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
e7e0: 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
e7f0: 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
e800: 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
e810: 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
e820: 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
e830: 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
e840: 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
e850: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
e860: 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
e870: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
e880: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
e890: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e8a0: 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
e8b0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
e8c0: 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
e8d0: 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
e8e0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
e8f0: 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
e900: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
e910: 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
e920: 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
e930: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
e940: 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
e950: 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
e960: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
e970: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
e980: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e990: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
e9a0: 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
e9b0: 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
e9c0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
e9d0: 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
e9e0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
e9f0: 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
ea00: 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
ea10: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
ea20: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
ea30: 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
ea40: 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
ea50: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
ea60: 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
ea70: 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
ea80: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
ea90: 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
eaa0: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
eab0: 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
eac0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
ead0: 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
eae0: 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
eaf0: 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
eb00: 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
eb10: 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
eb20: 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
eb30: 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
eb40: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
eb50: 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
eb60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
eb70: 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
eb80: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
eb90: 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
eba0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
ebb0: 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
ebc0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
ebd0: 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
ebe0: 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
ebf0: 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
ec00: 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
ec10: 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
ec20: 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
ec30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
ec40: 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
ec50: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
ec60: 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
ec70: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ec80: 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
ec90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
eca0: 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
ecb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
ecc0: 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
ecd0: 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
ece0: 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
ecf0: 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
ed00: 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
ed10: 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
ed20: 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
ed30: 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
ed40: 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
ed50: 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
ed60: 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
ed70: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
ed80: 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
ed90: 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
eda0: 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
edb0: 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
edc0: 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
edd0: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
ede0: 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
edf0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
ee00: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
ee10: 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
ee20: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
ee30: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
ee40: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
ee50: 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
ee60: 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
ee70: 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
ee80: 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
ee90: 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
eea0: 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
eeb0: 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
eec0: 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
eed0: 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
eee0: 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
eef0: 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
ef00: 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
ef10: 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
ef20: 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
ef30: 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
ef40: 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
ef50: 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
ef60: 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
ef70: 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
ef80: 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
ef90: 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
efa0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
efb0: 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
efc0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
efd0: 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
efe0: 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
eff0: 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
f000: 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
f010: 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
f020: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
f030: 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
f040: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
f050: 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72  rflag){.  BtShar
f060: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
f070: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
f080: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
f090: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
f0a0: 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
f0b0: 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  db;.  btreeInteg
f0c0: 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
f0d0: 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
f0e0: 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
f0f0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
f100: 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
f110: 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
f120: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
f130: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
f140: 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
f150: 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
f160: 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
f170: 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
f180: 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
f190: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
f1a0: 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
f1b0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
f1c0: 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20  s_begun;.  }..  
f1d0: 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
f1e0: 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
f1f0: 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
f200: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
f210: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61  /.  if( pBt->rea
f220: 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20  dOnly && wrflag 
f230: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
f240: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
f250: 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
f260: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  n;.  }..  /* If 
f270: 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
f280: 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
f290: 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
f2a0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
f2b0: 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
f2c0: 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
f2d0: 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
f2e0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
f2f0: 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
f300: 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
f310: 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  ITE_BUSY..  */. 
f320: 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
f330: 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
f340: 52 49 54 45 20 26 26 20 77 72 66 6c 61 67 20 29  RITE && wrflag )
f350: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
f360: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
f370: 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
f380: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f390: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
f3a0: 43 48 45 0a 20 20 69 66 28 20 77 72 66 6c 61 67  CHE.  if( wrflag
f3b0: 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  >1 ){.    BtLock
f3c0: 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72   *pIter;.    for
f3d0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
f3e0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
f3f0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
f400: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
f410: 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
f420: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f430: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67  _BUSY;.        g
f440: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
f450: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f460: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20   }.#endif..  do 
f470: 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  {.    if( pBt->p
f480: 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
f490: 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72 63    do{.        rc
f4a0: 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
f4b0: 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
f4c0: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
f4d0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
f4e0: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
f4f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f500: 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
f510: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61      if( pBt->rea
f520: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
f530: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
f540: 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
f550: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
f560: 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
f570: 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  in(pBt->pPage1->
f580: 70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67 3e  pDbPage, wrflag>
f590: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
f5a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f5b0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f5c0: 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
f5d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f5e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
f5f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f600: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
f610: 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e  wrflag ) pBt->in
f620: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
f630: 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  lse{.      unloc
f640: 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
f650: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
f660: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
f670: 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
f680: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
f690: 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
f6a0: 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
f6b0: 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
f6c0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
f6d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
f6e0: 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
f6f0: 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
f700: 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
f710: 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  tion++;.    }.  
f720: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
f730: 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
f740: 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
f750: 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
f760: 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
f770: 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
f780: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
f790: 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
f7a0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
f7b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
f7c0: 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77  _CACHE.    if( w
f7d0: 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20  rflag>1 ){.     
f7e0: 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
f7f0: 45 78 63 6c 75 73 69 76 65 20 29 3b 0a 20 20 20  Exclusive );.   
f800: 20 20 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69     pBt->pExclusi
f810: 76 65 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65  ve = p;.    }.#e
f820: 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73  ndif.  }...trans
f830: 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
f840: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
f850: 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
f860: 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
f870: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
f880: 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
f890: 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
f8a0: 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
f8b0: 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
f8c0: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
f8d0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
f8e0: 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
f8f0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
f900: 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
f910: 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
f920: 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
f930: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
f940: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
f950: 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
f960: 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
f970: 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
f980: 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
f990: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
f9a0: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
f9b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
f9c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f9d0: 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
f9e0: 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
f9f0: 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
fa00: 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
fa10: 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
fa20: 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
fa30: 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
fa40: 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
fa50: 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
fa60: 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
fa70: 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
fa80: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
fa90: 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
faa0: 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
fab0: 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
fac0: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
fad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
faf0: 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
fb00: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
fb10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fb20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fb30: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
fb40: 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
fb50: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
fb80: 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
fb90: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
fba0: 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
fbb0: 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
fbc0: 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
fbd0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
fbe0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fbf0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
fc00: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
fc10: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
fc20: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
fc30: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
fc40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fc50: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
fc60: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
fc70: 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
fc80: 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
fc90: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
fca0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
fcb0: 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
fcc0: 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
fcd0: 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
fce0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
fcf0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
fd00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fd10: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
fd20: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
fd30: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
fd40: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
fd50: 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
fd60: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
fd70: 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
fd80: 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
fd90: 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
fda0: 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
fdb0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
fdc0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
fdd0: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
fde0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
fdf0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
fe00: 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
fe10: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
fe20: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
fe30: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
fe40: 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
fe50: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
fe60: 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
fe70: 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
fe80: 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
fe90: 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
fea0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
feb0: 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
fec0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fed0: 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
fee0: 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  ge, which is gua
fef0: 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  renteed to be a 
ff00: 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20  btree page, not 
ff10: 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  an overflow.** p
ff20: 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  age, is a pointe
ff30: 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
ff40: 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
ff50: 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
ff60: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f  points to.** iTo
ff70: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
ff80: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
ff90: 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
ffa0: 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  to be modified, 
ffb0: 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a  as .** follows:.
ffc0: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
ffd0: 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
ffe0: 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
fff0: 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
10000 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
10030 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
10040 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
10050 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
10060 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
10070 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
10080 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
10090 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
100a0 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
100b0 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
100c0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
100d0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
100e0 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
100f0 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
10100 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
10110 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
10130 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
10140 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
10150 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
10160 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
10170 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
10180 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
10190 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
101a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
101b0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
101c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
101d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
101e0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
101f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
10200 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
10210 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
10220 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
10230 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
10240 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
10250 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
10260 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
10270 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
10280 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
10290 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
102a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
102b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
102c0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
102d0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
102e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
102f0 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
10300 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
10310 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
10320 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69  nCell;..    sqli
10330 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
10340 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
10350 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
10360 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
10370 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
10380 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
10390 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
103a0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
103b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
103c0 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
103d0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
103e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
103f0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
10400 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
10410 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
10420 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
10430 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
10440 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
10450 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
10460 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a  .iOverflow]) ){.
10470 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
10480 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
10490 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
104a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
104b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
104c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
104d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
104e0 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
104f0 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
10500 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
10510 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
10520 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10540 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
10550 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
10560 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
10570 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
10580 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
10590 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
105a0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
105b0 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
105c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
105d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
105e0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
105f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
10600 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
10610 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
10620 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
10630 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
10640 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
10650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10660 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
10670 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
10680 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
10690 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
106a0 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
106b0 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
106c0 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
106d0 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
106e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
106f0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
10700 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
10710 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
10720 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
10730 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
10740 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
10750 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
10760 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
10770 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
10780 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
10790 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
107a0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
107b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
107c0 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
107d0 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
107e0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
107f0 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
10800 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
10810 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
10820 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
10830 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50  Commit.){.  MemP
10840 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
10850 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
10860 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
10870 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
10880 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
10890 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
108a0 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
108b0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
108c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
108d0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
108e0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
108f0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
10900 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
10910 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
10920 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
10930 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
10940 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
10950 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10960 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
10970 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
10980 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
10990 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
109a0 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
109b0 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
109c0 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
109d0 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
109e0 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
109f0 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
10a00 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
10a10 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
10a20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
10a30 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
10a40 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
10a50 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
10a60 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
10a70 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
10a80 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
10a90 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
10aa0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
10ac0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
10ad0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
10ae0 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
10af0 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
10b00 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
10b10 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
10b20 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
10b30 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
10b40 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
10b50 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
10b60 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
10b70 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
10b80 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
10b90 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
10ba0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
10bb0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
10bc0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
10bd0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
10be0 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
10bf0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
10c00 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
10c10 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
10c20 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
10c30 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
10c40 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
10c50 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
10c60 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
10c70 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
10c80 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
10c90 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
10ca0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
10cb0 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
10cc0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
10cd0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
10ce0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10cf0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10d00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
10d10 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
10d20 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
10d30 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
10d40 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
10d50 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
10d60 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
10d70 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
10d80 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
10d90 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
10da0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10db0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
10dc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
10dd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10de0 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
10df0 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
10e00 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
10e10 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
10e20 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
10e30 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
10e40 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
10e50 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
10e60 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
10e70 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
10e80 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
10e90 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
10ea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
10eb0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
10ec0 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
10ed0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
10ee0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10ef0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10f00 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
10f10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
10f20 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
10f30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
10f40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10f50 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
10f60 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
10f70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10f80 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
10f90 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
10fa0 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
10fb0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
10fc0 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
10fd0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
10fe0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11000 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
11010 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
11020 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29  eType, iPtrPage)
11030 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11040 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
11050 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
11060 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
11070 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
11080 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
11090 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
110a0 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
110b0 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
110c0 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
110d0 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
110e0 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
110f0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
11100 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
11110 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
11120 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
11130 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
11140 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
11150 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63  no.** point in c
11160 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
11170 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
11180 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
11190 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
111a0 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
111b0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
111c0 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
111d0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73  e .** database s
111e0 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  o that the last 
111f0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
11200 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
11210 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e.** is no longe
11220 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
11230 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61  If the nFin para
11240 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
11250 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  o, the implement
11260 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a  ation assumes.**
11270 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
11280 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
11290 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
112a0 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20  p() until.** it 
112b0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
112c0 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c  ONE or an error,
112d0 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69   and that nFin i
112e0 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
112f0 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74  of pages the dat
11300 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
11310 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68  contain after th
11320 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  is .** process i
11330 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73  s complete..*/.s
11340 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
11350 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
11360 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
11370 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29  n, Pgno iLastPg)
11380 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
11390 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
113a0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
113b0 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
113c0 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
113d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
113e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
113f0 74 65 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  tex) );..  if( !
11400 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
11410 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
11420 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
11430 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
11440 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
11450 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
11460 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
11470 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
11480 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
11490 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
114a0 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
114b0 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d  List==0 || nFin=
114c0 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20  =iLastPg ){.    
114d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
114e0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
114f0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
11500 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
11510 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
11520 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11550 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
11560 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
11570 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11580 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11590 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
115a0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
115b0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
115c0 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
115d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
115e0 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
115f0 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
11600 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
11610 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
11620 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
11630 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
11640 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
11650 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
11660 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
11670 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
11680 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
11690 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
116a0 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
116b0 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
116c0 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
116d0 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
116e0 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
116f0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
11700 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
11710 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
11720 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
11730 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
11740 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
11750 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
11760 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
11770 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11780 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
11790 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
117a0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
117b0 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
117c0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
117d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
117e0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
117f0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
11800 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
11810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
11820 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
11830 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
11840 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
11850 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
11860 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11870 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
11880 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
11890 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
118a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
118b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
118c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
118d0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
118e0 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
118f0 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
11900 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
11910 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
11920 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
11930 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
11940 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
11950 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
11960 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
11970 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
11980 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
11990 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
119a0 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
119b0 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
119c0 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
119d0 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
119e0 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
119f0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
11a00 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
11a10 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
11a20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
11a30 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
11a40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
11a50 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
11a60 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
11a70 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
11a80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
11a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11aa0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
11ab0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
11ac0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
11ad0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11ae0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
11af0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
11b00 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
11b10 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
11b20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11b30 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
11b40 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
11b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11b60 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
11b70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
11b80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11b90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
11ba0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
11bb0 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
11bc0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
11bd0 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29  FreePg, nFin!=0)
11be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11bf0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
11c00 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
11c10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11c20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11c30 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
11c40 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69  }.  }..  if( nFi
11c50 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  n==0 ){.    iLas
11c60 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  tPg--;.    while
11c70 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
11c80 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
11c90 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
11ca0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
11cb0 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
11cc0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  -;.    }.    sql
11cd0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
11ce0 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
11cf0 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20  er, iLastPg);.  
11d00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
11d10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
11d20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
11d30 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
11d40 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
11d50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
11d60 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
11d70 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
11d80 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
11d90 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
11da0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
11db0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
11dc0 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
11dd0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
11de0 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
11df0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
11e00 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
11e10 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
11e20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
11e30 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ured,.** SQLITE_
11e40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
11e50 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  Otherwise an SQL
11e60 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
11e70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11e80 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42  treeIncrVacuum(B
11e90 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
11ea0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
11eb0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
11ec0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11ed0 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
11ee0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
11ef0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
11f00 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
11f10 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
11f20 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
11f30 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
11f40 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
11f50 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
11f60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
11f70 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
11f80 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
11f90 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
11fa0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20  uumStep(pBt, 0, 
11fb0 73 71 6c 69 74 65 33 50 61 67 65 72 49 6d 61 67  sqlite3PagerImag
11fc0 65 53 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  eSize(pBt->pPage
11fd0 72 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r));.  }.  sqlit
11fe0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11ff0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12000 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12010 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
12020 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
12030 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
12040 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
12050 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
12060 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
12070 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
12080 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
12090 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
120a0 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
120b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
120c0 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
120d0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
120e0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
120f0 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
12100 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
12110 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
12120 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
12130 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
12140 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
12150 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
12160 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
12170 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
12180 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
12190 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
121a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
121b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
121c0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
121d0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
121e0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
121f0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
12200 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
12210 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12220 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
12230 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
12240 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
12250 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
12260 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
12270 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
12280 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
12290 50 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20 20 50  Pgno nFin;.    P
122a0 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 50  gno nFree;.    P
122b0 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  gno nPtrmap;.   
122c0 20 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20 20 20   Pgno iFree;.   
122d0 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
122e0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  = pBt->pageSize;
122f0 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
12300 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
12310 28 70 42 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  (pBt);..    if( 
12320 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
12330 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20  t, nOrig) ){.   
12340 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12350 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
12360 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 72     }.    if( nOr
12370 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
12380 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
12390 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20      nOrig--;.   
123a0 20 7d 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67   }.    nFree = g
123b0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
123c0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
123d0 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20  ;.    nPtrmap = 
123e0 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
123f0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
12400 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28  nOrig)+pgsz/5)/(
12410 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69  pgsz/5);.    nFi
12420 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
12430 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
12440 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
12450 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
12460 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49  ) && nFin<=PENDI
12470 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
12480 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d  ) ){.      nFin-
12490 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  -;.    }.    whi
124a0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
124b0 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
124c0 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
124d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
124e0 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
124f0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 46 72    }..    for(iFr
12500 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
12510 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
12520 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
12530 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
12540 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
12550 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20  nFin, iFree);.  
12560 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
12570 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
12580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
12590 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
125a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
125b0 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  K;.      rc = sq
125c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
125d0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
125e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74  Page);.      put
125f0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
12600 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
12610 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
12620 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
12630 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20  aData[36], 0);. 
12640 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
12650 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
12660 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e  Bt->pPager, nFin
12670 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
12680 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12690 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
126a0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
126b0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
126c0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d  .  assert( nRef=
126d0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
126e0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
126f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12700 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
12710 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12720 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  TOVACUUM */../*.
12730 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12740 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
12750 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
12760 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
12770 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
12780 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
12790 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
127a0 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
127b0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
127c0 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
127d0 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
127e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
127f0 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
12800 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
12810 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
12820 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
12830 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
12840 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
12850 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
12860 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
12870 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
12880 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
12890 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
128a0 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
128b0 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
128c0 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
128d0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
128e0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
128f0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
12900 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
12910 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
12920 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
12930 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
12940 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
12950 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
12960 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
12970 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
12980 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
12990 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
129a0 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
129b0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
129c0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
129d0 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73  mmit() for the s
129e0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
129f0 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
12a00 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
12a10 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
12a20 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
12a30 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
12a40 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
12a50 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
12a60 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
12a70 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
12a80 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
12a90 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
12aa0 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
12ab0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
12ac0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
12ad0 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
12ae0 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
12af0 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
12b00 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
12b10 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
12b20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12b30 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
12b40 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
12b50 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
12b60 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
12b70 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12b80 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
12b90 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
12ba0 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
12bb0 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
12bc0 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
12bd0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
12be0 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
12bf0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
12c00 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
12c10 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
12c20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
12c30 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
12c40 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
12c50 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
12c60 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
12c70 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
12c80 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12c90 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
12ca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
12cb0 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
12cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12cd0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
12ce0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
12cf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12d00 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c   p->pBt;.    sql
12d10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12d20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  );.    pBt->db =
12d30 20 70 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20   p->db;.#ifndef 
12d40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12d50 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
12d60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
12d70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
12d80 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
12d90 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
12da0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
12dc0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
12dd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12de0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
12df0 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
12e00 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
12e10 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
12e20 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
12e30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
12e40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
12e50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12e60 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
12e70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
12e80 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
12e90 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
12ea0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
12eb0 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
12ec0 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
12ed0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
12ee0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
12ef0 63 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  c() routine does
12f00 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
12f10 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69   and should be i
12f20 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20  nvoked.** prior 
12f30 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
12f40 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
12f50 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29  lite3BtreeSync()
12f60 20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20   routine did.** 
12f70 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
12f80 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
12f90 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
12fa0 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
12fb0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
12fc0 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
12fd0 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
12fe0 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
12ff0 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
13000 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
13010 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
13020 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  e the rollback j
13030 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68  ournal.** (which
13040 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
13050 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
13060 74 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b  t) and drop lock
13070 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  s..**.** This wi
13080 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
13090 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
130a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
130b0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
130c0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
130d0 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
130e0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
130f0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
13100 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
13110 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b  seTwo(Btree *p){
13120 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13130 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
13140 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13150 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
13160 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e  p->db;.  btreeIn
13170 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
13180 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
13190 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
131a0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
131b0 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
131c0 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
131d0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
131e0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
131f0 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
13200 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
13210 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
13220 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
13230 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
13240 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13250 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
13260 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
13270 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
13280 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
13290 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
132a0 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
132b0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
132c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
132d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
132e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
132f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13300 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72   }.    pBt->inTr
13310 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
13320 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d  S_READ;.    pBt-
13330 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
13340 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
13350 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  es(p);..  /* If 
13360 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
13370 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
13380 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
13390 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73  rement the trans
133a0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e  action.  ** coun
133b0 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
133c0 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
133d0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
133e0 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20  reaches 0, set. 
133f0 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20 73   ** the shared s
13400 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
13410 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
13420 72 65 65 49 66 55 6e 75 73 65 64 28 29 20 63 61  reeIfUnused() ca
13430 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69  ll below.  ** wi
13440 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
13450 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ger..  */.  if( 
13460 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
13470 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42  S_NONE ){.    pB
13480 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
13490 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
134a0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
134b0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
134c0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
134d0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
134e0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
134f0 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e  e handles curren
13500 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
13510 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
13520 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a  E and unlock.  *
13530 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20 74  * the pager if t
13540 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
13550 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
13560 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
13570 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e  on..  */.  p->in
13580 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
13590 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65  NE;.  unlockBtre
135a0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
135b0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
135c0 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
135d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
135e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
135f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
13600 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
13610 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
13620 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
13630 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
13640 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
13650 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13660 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
13670 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
13680 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
13690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
136a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
136b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
136c0 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  o(p);.  }.  sqli
136d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
136e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
136f0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
13700 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13710 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
13720 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
13730 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
13740 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
13750 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
13760 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
13770 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
13780 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
13790 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
137a0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
137b0 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
137c0 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63  utine, a write-c
137d0 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
137e0 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
137f0 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e  apable of writin
13800 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
13810 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
13820 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
13830 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
13840 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  d for writing an
13850 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  d the cursor has
13860 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64   not be disabled
13870 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74  .** by having it
13880 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20  s state changed 
13890 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e  to CURSOR_FAULT.
138a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
138b0 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
138c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
138d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
138e0 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
138f0 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
13900 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
13910 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
13920 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
13930 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e  wrFlag && pCur->
13940 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
13950 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
13960 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
13970 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
13980 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
13990 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
139a0 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
139b0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
139c0 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
139d0 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
139e0 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
139f0 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
13a00 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
13a10 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
13a20 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
13a30 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
13a40 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
13a50 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
13a60 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
13a70 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
13a80 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
13a90 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
13aa0 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
13ab0 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
13ac0 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
13ad0 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
13ae0 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
13af0 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
13b00 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
13b10 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
13b20 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
13b30 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
13b40 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
13b50 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
13b60 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
13b70 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
13b80 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
13b90 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
13ba0 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
13bb0 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
13bc0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
13bd0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
13be0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
13bf0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
13c00 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
13c10 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
13c20 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
13c30 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
13c40 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
13c50 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
13c60 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
13c70 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
13c80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
13c90 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
13ca0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e  rsor(p);.    p->
13cb0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
13cc0 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b  FAULT;.    p->sk
13cd0 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  ip = errCode;.  
13ce0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
13cf0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
13d00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13d10 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
13d20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
13d30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
13d40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13d50 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
13d60 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
13d70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
13d80 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
13d90 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
13da0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
13db0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
13dc0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
13dd0 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
13de0 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
13df0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
13e00 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
13e10 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
13e20 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
13e30 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
13e40 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
13e50 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13e60 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
13e70 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
13e80 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
13e90 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
13ea0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
13eb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13ec0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
13ed0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
13ee0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13ef0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
13f00 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
13f10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13f20 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
13f30 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
13f40 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
13f50 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
13f60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13f70 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
13f80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13f90 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
13fa0 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
13fb0 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
13fc0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
13fd0 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 0a   occured whilst.
13fe0 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
13ff0 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
14000 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
14010 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
14020 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
14030 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
14040 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
14050 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
14060 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
14070 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
14080 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
14090 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
140a0 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
140b0 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
140c0 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
140d0 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
140e0 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
140f0 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
14100 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
14110 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
14120 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
14130 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
14140 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
14150 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
14160 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
14170 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72  pAllCursors(p, r
14180 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  c);.  }.#endif. 
14190 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
141a0 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54  p);.  unlockAllT
141b0 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28  ables(p);..  if(
141c0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
141d0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
141e0 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
141f0 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
14200 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
14210 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
14220 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
14230 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
14240 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
14250 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
14260 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
14270 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
14280 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
14290 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
142a0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
142b0 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
142c0 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74  * call sqlite3Bt
142d0 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
142e0 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
142f0 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
14300 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
14310 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
14320 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
14330 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
14340 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
14350 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
14360 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
14370 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
14380 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
14390 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
143a0 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
143b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
143c0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
143d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69  .  }..  if( p->i
143e0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
143f0 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  NE ){.    assert
14400 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
14410 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74  ion>0 );.    pBt
14420 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
14430 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74  ;.    if( 0==pBt
14440 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
14450 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
14460 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
14470 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  NS_NONE;.    }. 
14480 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73   }..  p->inTrans
14490 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
144a0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
144b0 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
144c0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
144d0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
144e0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
144f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
14500 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14510 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
14520 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
14530 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e  on.  The subtran
14540 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63  saction can.** c
14550 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
14560 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
14570 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
14580 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20  saction..** You 
14590 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
145a0 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
145b0 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
145c0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
145d0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
145e0 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
145f0 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d  tically if the m
14600 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ain transaction.
14610 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  ** commits or ro
14620 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
14630 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e  Only one subtran
14640 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61  saction may be a
14650 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e  ctive at a time.
14660 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72    It is an error
14670 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74   to try.** to st
14680 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72 61  art a new subtra
14690 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74  nsaction if anot
146a0 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74 69  her subtransacti
146b0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
146c0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  tive..**.** Stat
146d0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
146e0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
146f0 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
14700 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
14710 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
14720 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
14730 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
14740 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
14750 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
14760 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
14770 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
14780 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
14790 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
147a0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
147b0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
147c0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
147d0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
147e0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
147f0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
14800 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
14810 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
14820 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14830 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14840 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
14850 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
14860 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  f( (p->inTrans!=
14870 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20  TRANS_WRITE) || 
14880 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20  pBt->inStmt ){. 
14890 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
148a0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
148b0 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
148c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
148d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
148e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
148f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
14900 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61      if( pBt->rea
14910 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 72  dOnly ){.      r
14920 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14940 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
14950 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
14960 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
14970 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
14980 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  th.      ** an i
14990 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
149a0 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
149b0 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
149c0 74 6c 79 20 75 73 69 6e 67 0a 20 20 20 20 20 20  tly using.      
149d0 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
149e0 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
149f0 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
14a00 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
14a10 79 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  y.      ** such 
14a20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
14a30 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
14a40 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
14a50 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
14a60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
14a70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14a80 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
14a90 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
14aa0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 31 29 3b  ->nSavepoint+1);
14ab0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
14ac0 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a  inStmt = 1;.  }.
14ad0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
14ae0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
14af0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
14b00 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e  mmit the statmen
14b10 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
14b20 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
14b30 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a  ogress.  If no.*
14b40 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  * subtransaction
14b50 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 69 73   is active, this
14b60 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
14b70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14b80 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65  CommitStmt(Btree
14b90 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
14ba0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14bb0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
14bc0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
14bd0 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
14be0 3e 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  >db;.  if( pBt->
14bf0 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e  inStmt && !pBt->
14c00 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
14c10 69 6e 74 20 69 53 74 6d 74 70 6f 69 6e 74 20 3d  int iStmtpoint =
14c20 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
14c30 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  nt;.    rc = sql
14c40 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
14c50 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
14c60 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
14c70 45 2c 20 69 53 74 6d 74 70 6f 69 6e 74 29 3b 0a  E, iStmtpoint);.
14c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
14c90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
14ca0 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
14cb0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
14cc0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
14cd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14ce0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61  * Rollback the a
14cf0 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20  ctive statement 
14d00 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
14d10 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61   If no subtransa
14d20 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69  ction.** is acti
14d30 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ve this routine 
14d40 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
14d50 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69  * All cursors wi
14d60 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
14d70 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
14d80 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
14d90 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75  t.** to use a cu
14da0 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  rsor that was op
14db0 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
14dc0 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
14dd0 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65  ation.** will re
14de0 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
14df0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14e00 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
14e10 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
14e20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14e30 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
14e40 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
14e50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14e60 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
14e70 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42   p->db;.  if( pB
14e80 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
14e90 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
14ea0 20 20 20 69 6e 74 20 69 53 74 6d 74 70 6f 69 6e     int iStmtpoin
14eb0 74 20 3d 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  t = p->db->nSave
14ec0 70 6f 69 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20  point;.    rc = 
14ed0 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
14ee0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
14ef0 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  r, SAVEPOINT_ROL
14f00 4c 42 41 43 4b 2c 20 69 53 74 6d 74 70 6f 69 6e  LBACK, iStmtpoin
14f10 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
14f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14f30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14f40 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
14f50 74 2d 3e 70 50 61 67 65 72 2c 20 53 41 56 45 50  t->pPager, SAVEP
14f60 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
14f70 74 6d 74 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  tmtpoint);.    }
14f80 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
14f90 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
14fa0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14fb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14fc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
14fd0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
14fe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
14ff0 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
15000 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
15010 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
15020 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
15030 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
15040 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
15050 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
15060 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
15070 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
15080 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
15090 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
150a0 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
150b0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
150c0 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
150d0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
150e0 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
150f0 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
15100 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
15110 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
15120 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
15130 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
15140 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
15150 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
15160 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
15170 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
15180 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
15190 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
151a0 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
151b0 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
151c0 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
151d0 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
151e0 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
151f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15200 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
15210 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
15220 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
15230 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15240 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
15250 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
15260 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
15270 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15280 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
15290 65 72 74 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74  ert( pBt->inStmt
152a0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
152b0 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
152c0 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
152d0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
152e0 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
152f0 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
15300 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
15310 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
15320 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
15330 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
15340 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 70  eEnter(p);.    p
15350 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
15360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15370 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
15380 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
15390 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
153a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
153b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
153c0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
153d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
153e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
153f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15400 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
15410 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
15420 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
15430 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
15440 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
15450 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20  le.  The act of 
15460 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72 73  acquiring a curs
15470 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20 6c  or gets a read l
15480 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64  ock on .** the d
15490 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
154a0 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
154b0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
154c0 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
154d0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
154e0 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
154f0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
15500 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
15510 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
15520 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
15530 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
15540 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
15550 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
15560 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
15570 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
15580 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
15590 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
155a0 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
155b0 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
155c0 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
155d0 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
155e0 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
155f0 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
15600 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
15610 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
15620 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
15630 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
15640 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
15650 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
15660 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
15670 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
15680 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
15690 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
156a0 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
156b0 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
156c0 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
156d0 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
156e0 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
156f0 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
15700 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
15710 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
15720 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
15730 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
15740 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
15750 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
15760 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
15770 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
15780 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
15790 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
157a0 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
157b0 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
157c0 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
157d0 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
157e0 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
157f0 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
15800 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
15810 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
15820 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
15830 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
15840 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
15850 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
15860 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
15870 53 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20  Size() bytes of 
15880 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74  memory .** point
15890 65 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61  ed to by pCur ha
158a0 76 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  ve been zeroed b
158b0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  y the caller..*/
158c0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
158d0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
158e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
15910 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
15940 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
15950 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
15960 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
15990 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
159a0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
159b0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
159c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
159d0 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
159e0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
159f0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
15a00 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
15a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15a20 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
15a30 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sor */.){.  int 
15a40 72 63 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  rc;.  Pgno nPage
15a50 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
15a60 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
15a70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
15a80 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
15a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
15aa0 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
15ab0 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 77 72  g==1 );.  if( wr
15ac0 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
15ad0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
15ae0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15af0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
15b00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65     }.    if( che
15b10 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69  ckReadLocks(p, i
15b20 54 61 62 6c 65 2c 20 30 2c 20 30 29 20 29 7b 0a  Table, 0, 0) ){.
15b30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15b40 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
15b50 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  }.  }..  if( pBt
15b60 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
15b70 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
15b80 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20  eWithRetry(p);. 
15b90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15ba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
15bb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15bc0 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
15bd0 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29  Only && wrFlag )
15be0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15bf0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
15c00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
15c10 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
15c20 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72 63 20  no)iTable;.  rc 
15c30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
15c40 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
15c50 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61  ger, (int *)&nPa
15c60 67 65 29 3b 20 0a 20 20 69 66 28 20 72 63 21 3d  ge); .  if( rc!=
15c70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
15c90 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
15ca0 26 26 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  && nPage==0 ){. 
15cb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
15cc0 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63  MPTY;.    goto c
15cd0 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
15ce0 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63  eption;.  }.  rc
15cf0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
15d00 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
15d10 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
15d20 50 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66 28 20  Page[0]);.  if( 
15d30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15d40 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
15d50 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
15d60 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  n;.  }..  /* Now
15d70 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
15d80 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
15d90 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
15da0 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
15db0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20    ** variables, 
15dc0 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
15dd0 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
15de0 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a  d list and set *
15df0 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20  ppCur (the.  ** 
15e00 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20  output argument 
15e10 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
15e20 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  )..  */.  pCur->
15e30 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
15e40 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
15e50 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
15e60 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
15e70 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38  ur->wrFlag = (u8
15e80 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d  )wrFlag;.  pCur-
15e90 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
15ea0 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
15eb0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
15ec0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
15ed0 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
15ee0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
15ef0 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
15f00 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
15f10 56 41 4c 49 44 3b 0a 0a 20 20 72 65 74 75 72 6e  VALID;..  return
15f20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65   SQLITE_OK;..cre
15f30 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
15f40 74 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50  tion:.  releaseP
15f50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
15f60 5b 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  [0]);.  unlockBt
15f70 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
15f80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15f90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15fa0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
15fb0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
15fe0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
15ff0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16010 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
16020 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
16030 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
16040 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16060 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
16070 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
16080 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
16090 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
160c0 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
160d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
16100 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
16110 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
16120 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
16130 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
16140 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64  ->pBt->db = p->d
16150 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  b;.  rc = btreeC
16160 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
16170 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
16180 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
16190 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
161a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
161b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
161c0 65 43 75 72 73 6f 72 53 69 7a 65 28 29 7b 0a 20  eCursorSize(){. 
161d0 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42   return sizeof(B
161e0 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f  tCursor);.}..../
161f0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
16200 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
16210 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16220 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
16230 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
16240 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
16250 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
16260 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
16270 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
16280 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
16290 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
162a0 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
162b0 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
162c0 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
162d0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
162e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
162f0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
16300 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  .    pBt->db = p
16310 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 73  Btree->db;.    s
16320 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
16330 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
16340 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
16350 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
16360 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
16370 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
16380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
16390 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
163a0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
163b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
163c0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
163d0 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
163e0 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
163f0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
16400 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
16410 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
16420 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
16430 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
16440 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
16450 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
16460 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
16470 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
16480 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
16490 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
164a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
164b0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
164c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
164d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
164e0 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72   Make a temporar
164f0 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c  y cursor by fill
16500 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64  ing in the field
16510 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a  s of pTempCur..*
16520 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * The temporary 
16530 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e  cursor is not on
16540 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74   the cursor list
16550 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a   for the Btree..
16560 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
16570 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f  treeGetTempCurso
16580 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
16590 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d  , BtCursor *pTem
165a0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCur){.  int i;.
165b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
165c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
165d0 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65   );.  memcpy(pTe
165e0 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a  mpCur, pCur, siz
165f0 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
16600 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78    pTempCur->pNex
16610 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75  t = 0;.  pTempCu
16620 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  r->pPrev = 0;.  
16630 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d  for(i=0; i<=pTem
16640 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
16650 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
16660 67 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d  gerRef(pTempCur-
16670 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50  >apPage[i]->pDbP
16680 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  age);.  }.  asse
16690 72 74 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b  rt( pTempCur->pK
166a0 65 79 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ey==0 );.}../*.*
166b0 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f  * Delete a tempo
166c0 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68  rary cursor such
166d0 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20   as was made by 
166e0 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72  the CreateTempor
166f0 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66  aryCursor().** f
16700 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a  unction above..*
16710 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
16720 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75  reeReleaseTempCu
16730 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
16740 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
16750 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
16760 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
16770 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
16780 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
16790 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  +){.    sqlite3P
167a0 61 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e  agerUnref(pCur->
167b0 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61  apPage[i]->pDbPa
167c0 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ge);.  }.  sqlit
167d0 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
167e0 65 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ey);.}../*.** Ma
167f0 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
16800 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
16810 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
16820 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
16830 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
16840 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
16850 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
16860 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33   call.** sqlite3
16870 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
16880 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
16890 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
168a0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
168b0 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
168c0 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
168d0 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
168e0 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
168f0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
16900 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
16910 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
16920 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36  )..**.** 2007-06
16930 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61  -25:  There is a
16940 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72   bug in some ver
16950 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68  sions of MSVC th
16960 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20  at cause the.** 
16970 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73  compiler to cras
16980 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e  h when getCellIn
16990 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e  fo() is implemen
169a0 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a  ted as a macro..
169b0 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20  ** But there is 
169c0 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70  a measureable sp
169d0 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f  eed advantage to
169e0 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f   using the macro
169f0 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e   on gcc.** (when
16a00 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f   less compiler o
16a10 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b  ptimizations lik
16a20 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65  e -Os or -O0 are
16a30 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
16a40 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74   compiler is not
16a50 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65   doing agressive
16a60 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20   inlining.)  So 
16a70 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75  we use a real fu
16a80 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53  nction.** for MS
16a90 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66  VC and a macro f
16aa0 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c  or everything el
16ab0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35  se.  Ticket #245
16ac0 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  7..*/.#ifndef ND
16ad0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
16ae0 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
16af0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
16b00 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
16b10 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
16b20 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
16b30 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
16b40 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
16b50 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  nfo));.    sqlit
16b60 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
16b70 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
16b80 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
16b90 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
16ba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
16bb0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
16bc0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
16bd0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
16be0 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
16bf0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
16c00 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
16c10 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
16c20 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
16c30 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
16c40 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
16c50 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
16c60 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
16c70 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
16c80 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
16c90 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
16ca0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
16cb0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
16cc0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
16cd0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
16ce0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
16cf0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
16d00 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
16d10 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
16d20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
16d30 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Key = 1;.    }el
16d40 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
16d50 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
16d60 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
16d70 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
16d80 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
16d90 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
16da0 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
16db0 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
16dc0 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
16dd0 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
16de0 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
16e30 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e70 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   \.    int iPage
16e80 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   = pCur->iPage; 
16e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ec0 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42    \.    sqlite3B
16ed0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
16ee0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
16ef0 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
16f00 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
16f10 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76  ); \.    pCur->v
16f20 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20  alidNKey = 1;   
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f60 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
16f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
16fc0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
17010 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
17020 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  /../*.** Set *pS
17030 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
17040 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
17050 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
17060 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
17070 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
17080 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
17090 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
170a0 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
170b0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
170c0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
170d0 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
170e0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
170f0 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
17100 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
17110 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
17120 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
17130 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
17140 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a   in the key..*/.
17150 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17160 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
17170 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
17180 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ze){.  int rc;..
17190 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
171a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
171b0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
171c0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
171d0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
171e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
171f0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
17200 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
17210 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
17220 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
17230 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
17240 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
17250 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
17260 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
17270 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
17280 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
17290 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
172a0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
172b0 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nKey;.    }.  }
172c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
172d0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
172e0 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
172f0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
17300 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
17310 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
17320 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
17330 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
17340 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61  SQLITE_OK..** Fa
17350 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
17360 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63  sible.  If the c
17370 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72  ursor is not cur
17380 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
17390 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28  ng to an entry (
173a0 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e  which can happen
173b0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
173c0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
173d0 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e  e is empty) then
173e0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
173f0 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
17400 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
17410 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
17420 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
17430 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
17440 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
17450 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
17460 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
17470 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
17480 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
174a0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
174b0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
174c0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
174d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
174e0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
174f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
17500 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
17510 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  /* Not pointing 
17520 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
17530 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f   - set *pSize to
17540 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53   0. */.      *pS
17550 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
17560 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
17570 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
17580 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
17590 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
175a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
175b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
175c0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
175d0 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
175e0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
175f0 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
17600 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
17610 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
17620 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
17630 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
17640 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
17650 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
17660 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
17670 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
17680 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
17690 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
176a0 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
176b0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
176c0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
176d0 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
176e0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
176f0 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
17700 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
17710 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
17720 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70  :.**.** Unless p
17730 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c  PgnoNext is NULL
17740 2c 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  , the page numbe
17750 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
17760 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20  erflow .** page 
17770 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
17780 73 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  st is written to
17790 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
177a0 70 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20  page ovfl.** is 
177b0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
177c0 20 69 74 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74   its linked list
177d0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
177e0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
177f0 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
17800 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61   not NULL, *ppPa
17810 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ge is set to the
17820 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65   MemPage* handle
17830 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66  .** for page ovf
17840 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  l. The underlyin
17850 67 20 70 61 67 65 72 20 70 61 67 65 20 6d 61 79  g pager page may
17860 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
17870 73 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  sted.** with the
17880 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
17890 73 65 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65  set, so the page
178a0 20 64 61 74 61 20 61 63 63 65 73 73 61 62 6c 65   data accessable
178b0 20 76 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e   via.** this han
178c0 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74  dle may not be t
178d0 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  rusted..*/.stati
178e0 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
178f0 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
17900 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20  d *pBt, .  Pgno 
17910 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
17920 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66          /* Overf
17930 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65  low page */.  Me
17940 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
17950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
17960 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
17970 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
17980 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
17990 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
179a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
179b0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
179c0 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69  no next = 0;.  i
179d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
179e0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
179f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17a00 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
17a10 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 73    /* One of thes
17a20 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 4e 55  e must not be NU
17a30 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 77  LL. Otherwise, w
17a40 68 79 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  hy call this fun
17a50 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73 65  ction? */.  asse
17a60 72 74 28 70 70 50 61 67 65 20 7c 7c 20 70 50 67  rt(ppPage || pPg
17a70 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 49  noNext);..  /* I
17a80 66 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e  f pPgnoNext is N
17a90 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
17aa0 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
17ab0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
17ac0 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61 67 65  n.  ** a MemPage
17ad0 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  * reference only
17ae0 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74 61 20 69  . No page-data i
17af0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
17b00 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  is case..  */.  
17b10 69 66 28 20 21 70 50 67 6e 6f 4e 65 78 74 20 29  if( !pPgnoNext )
17b20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
17b30 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
17b40 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70 70 50 61  (pBt, ovfl, ppPa
17b50 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66  ge, 1);.  }..#if
17b60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17b70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
17b80 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
17b90 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
17ba0 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
17bb0 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
17bc0 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
17bd0 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
17be0 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
17bf0 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
17c00 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
17c10 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
17c20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
17c30 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
17c40 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
17c50 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
17c60 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
17c70 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
17c80 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
17c90 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
17ca0 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
17cb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
17cc0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
17cd0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
17ce0 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
17cf0 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
17d00 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
17d10 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
17d20 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
17d30 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
17d40 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
17d50 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
17d60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
17d70 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67  iGuess<=pagerPag
17d80 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
17d90 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
17da0 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
17db0 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
17dc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17de0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17e00 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
17e10 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
17e20 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
17e30 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
17e40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17e50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
17e60 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61   next==0 || ppPa
17e70 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  ge ){.    MemPag
17e80 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
17e90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
17ea0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
17eb0 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e   ovfl, &pPage, n
17ec0 65 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73 73  ext!=0);.    ass
17ed0 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
17ee0 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
17ef0 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
17f00 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
17f10 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
17f20 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
17f30 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a  >aData);.    }..
17f40 20 20 20 20 69 66 28 20 70 70 50 61 67 65 20 29      if( ppPage )
17f50 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  {.      *ppPage 
17f60 3d 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c  = pPage;.    }el
17f70 73 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  se{.      releas
17f80 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
17f90 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f    }.  }.  *pPgno
17fa0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20  Next = next;..  
17fb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17fc0 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
17fd0 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
17fe0 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
17ff0 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
18000 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
18010 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
18020 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
18030 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
18040 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
18050 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
18060 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
18070 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
18080 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
18090 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
180a0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
180b0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
180c0 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
180d0 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
180e0 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
180f0 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
18100 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
18110 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
18120 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
18130 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
18140 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
18150 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18160 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
18170 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
18180 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
18190 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
181a0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
181b0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
181c0 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
181d0 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
181e0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
181f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
18200 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
18210 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
18220 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18230 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
18240 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
18270 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
18280 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
18290 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
182a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
182b0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
182c0 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
182d0 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
182e0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
182f0 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
18300 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
18310 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
18320 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
18330 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
18340 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
18360 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18370 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
18380 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
18390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
183a0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
183b0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
183c0 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
183d0 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
183e0 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
183f0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
18400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
18420 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
18430 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
18440 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
18450 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
18460 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
18470 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
18480 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49  s pointing to. I
18490 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72  f the eOp.** par
184a0 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69  ameter is 0, thi
184b0 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
184c0 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69  ation (data copi
184d0 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65  ed into.** buffe
184e0 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69  r pBuf). If it i
184f0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72  s non-zero, a wr
18500 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64  ite (data copied
18510 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20   from.** buffer 
18520 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  pBuf)..**.** A t
18530 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
18540 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
18550 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
18560 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
18570 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
18580 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
18590 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
185a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
185b0 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69  es not make a di
185c0 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65  stinction betwee
185d0 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a  n key and data..
185e0 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73  ** It just reads
185f0 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73   or writes bytes
18600 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61   from the payloa
18610 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69  d area.  Data mi
18620 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f  ght .** appear o
18630 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20  n the main page 
18640 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
18650 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
18660 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67  overflow .** pag
18670 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
18680 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72   BtCursor.isIncr
18690 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
186a0 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20  is set, and the 
186b0 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f  current.** curso
186c0 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65  r entry uses one
186d0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
186e0 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75  w pages, this fu
186f0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
18700 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e  tes space for an
18710 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74  d lazily popluat
18720 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
18730 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61  page-list .** ca
18740 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72  che array (BtCur
18750 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20  sor.aOverflow). 
18760 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
18770 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63   use this.** cac
18780 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
18790 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
187a0 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65  ed offset more e
187b0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
187c0 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
187d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
187e0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
187f0 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
18800 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
18810 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
18820 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
18830 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
18840 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
18850 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
18860 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
18870 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
18880 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
18890 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
188a0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
188b0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
188c0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
188d0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
188e0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
188f0 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
18900 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
18910 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
18920 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
18930 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
18940 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
18950 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
18960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
18970 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
18980 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
18990 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
189a0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
189b0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
189c0 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
189d0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
189e0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
189f0 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
18a00 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
18a10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
18a20 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
18a30 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
18a40 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
18a50 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
18a60 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
18a70 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  / .  int skipKey
18a80 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  ,         /* off
18a90 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61  set begins at da
18aa0 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
18ab0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20  ue */.  int eOp 
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ad0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
18ae0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
18af0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
18b00 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
18b10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18b20 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
18b30 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
18b40 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
18b50 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
18b60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
18b70 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
18b80 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
18b90 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
18ba0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bc0 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
18bd0 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
18be0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
18bf0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
18c00 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
18c10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
18c20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
18c30 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
18c40 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
18c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
18c60 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
18c70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65  Cur) );..  getCe
18c80 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
18c90 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
18ca0 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
18cb0 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
18cc0 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
18cd0 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
18ce0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
18cf0 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b  nKey);..  if( sk
18d00 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66  ipKey ){.    off
18d10 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d  set += nKey;.  }
18d20 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d  .  if( offset+am
18d30 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
18d40 6e 66 6f 2e 6e 44 61 74 61 20 0a 20 20 20 7c 7c  nfo.nData .   ||
18d50 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
18d60 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
18d70 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
18d80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
18d90 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
18da0 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
18db0 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
18dc0 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
18dd0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
18de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18df0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
18e00 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
18e10 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
18e20 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
18e30 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
18e40 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
18e50 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
18e60 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
18e70 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
18e80 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
18e90 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
18ea0 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
18eb0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
18ec0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
18ed0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
18ee0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
18ef0 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
18f00 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
18f10 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
18f20 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
18f30 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
18f40 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
18f50 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
18f60 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
18f70 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
18f80 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
18f90 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
18fa0 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
18fb0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
18fc0 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
18fd0 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
18fe0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
18ff0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
19000 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
19010 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
19020 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23  nfo.nLocal]);..#
19030 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19040 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
19050 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72  /* If the isIncr
19060 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
19070 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
19080 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
19090 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
190a0 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
190b0 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
190c0 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
190d0 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
190e0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
190f0 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
19100 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
19110 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
19120 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
19130 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
19140 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
19150 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
19160 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
19170 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
19180 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
19190 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
191a0 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
191b0 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
191c0 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
191d0 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
191e0 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
191f0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21  rblobHandle && !
19200 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
19210 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
19220 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
19230 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
19240 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
19250 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
19260 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
19270 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20  verflow = (Pgno 
19280 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
19290 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ero(sizeof(Pgno)
192a0 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69  *nOvfl);.      i
192b0 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75  f( nOvfl && !pCu
192c0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
192d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
192e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
192f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
19300 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
19310 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
19320 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
19330 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
19340 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
19350 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
19360 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
19370 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
19380 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
19390 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
193a0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
193b0 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
193c0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
193d0 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
193e0 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
193f0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
19400 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
19410 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
19420 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
19430 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
19440 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
19450 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
19460 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
19470 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
19480 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
19490 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
194a0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
194b0 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
194c0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
194d0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
194e0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
194f0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
19500 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
19510 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
19520 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
19530 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
19540 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
19550 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
19560 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
19570 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
19580 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
19590 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
195a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
195b0 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
195c0 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
195d0 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
195e0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
195f0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
19600 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
19610 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
19620 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
19630 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
19640 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
19650 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
19660 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
19670 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
19680 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
19690 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
196a0 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
196b0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
196c0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
196d0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
196e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
196f0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
19700 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
19710 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
19720 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
19730 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
19740 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
19750 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
19760 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
19770 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
19780 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
19790 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
197a0 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
197b0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
197c0 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
197d0 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
197e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
197f0 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
19800 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
19810 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
19820 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
19830 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
19840 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
19850 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
19860 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
19870 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
19880 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
19890 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
198a0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
198b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
198c0 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
198d0 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
198e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
198f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19900 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
19910 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
19920 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
19930 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
19940 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
19950 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
19960 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
19970 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
19980 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
19990 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
199a0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
199b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
199c0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
199d0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
199e0 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
199f0 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
19a00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19a10 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
19a20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ge);.          o
19a30 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
19a40 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
19a50 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d           pBuf +=
19a60 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   a;.        }.  
19a70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19a80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19a90 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
19aa0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19ab0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19ac0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
19ae0 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
19af0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
19b00 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
19b10 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
19b20 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
19b30 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
19b40 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
19b50 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
19b60 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
19b70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
19b80 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
19b90 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
19ba0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
19bb0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
19bc0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
19bd0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
19be0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
19bf0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
19c00 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
19c10 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
19c20 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
19c30 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
19c40 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
19c50 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
19c60 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
19c70 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
19c80 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
19c90 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
19ca0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19cb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
19cc0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
19cd0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19ce0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19cf0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
19d00 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
19d10 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
19d20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50     if( pCur->apP
19d30 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
19d40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
19d50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19d60 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
19d70 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
19d80 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
19d90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
19da0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
19db0 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
19dc0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
19dd0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
19de0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
19df0 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  f, 0, 0);.  }.  
19e00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19e10 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
19e20 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
19e30 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
19e40 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
19e50 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
19e60 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
19e70 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
19e80 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
19e90 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
19ea0 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
19eb0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
19ec0 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
19ed0 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
19ee0 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
19ef0 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
19f00 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
19f10 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
19f20 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
19f30 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
19f40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19f50 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
19f60 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
19f70 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
19f80 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
19f90 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
19fa0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
19fb0 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  OB.  if ( pCur->
19fc0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
19fd0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
19fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
19ff0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
1a000 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1a010 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1a020 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1a030 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
1a040 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1a050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a060 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a070 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a080 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
1a090 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1a0a0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
1a0b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1a0c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1a0d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1a0e0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1a0f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1a100 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1a110 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
1a120 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
1a130 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30   amt, pBuf, 1, 0
1a140 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1a150 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1a160 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1a170 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1a180 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
1a190 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
1a1a0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
1a1b0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
1a1c0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
1a1d0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1a1e0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
1a1f0 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
1a200 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
1a210 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
1a220 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
1a230 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
1a240 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
1a250 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
1a260 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
1a270 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
1a280 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
1a290 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
1a2a0 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
1a2b0 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
1a2c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a2d0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
1a2e0 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
1a2f0 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
1a300 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
1a310 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
1a320 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
1a330 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
1a340 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
1a350 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
1a360 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
1a370 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
1a380 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
1a390 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
1a3a0 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
1a3b0 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
1a3c0 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
1a3d0 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
1a3e0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
1a3f0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
1a400 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
1a410 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74   reassembly.** t
1a420 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
1a430 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
1a440 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
1a450 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
1a460 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
1a470 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
1a480 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
1a490 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
1a4a0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1a4b0 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
1a4c0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
1a4d0 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
1a4e0 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
1a4f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1a500 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
1a510 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1a520 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
1a530 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1a540 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
1a550 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
1a560 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
1a570 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
1a580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1a590 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
1a5a0 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
1a5b0 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
1a5c0 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
1a5d0 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
1a5e0 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
1a5f0 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
1a600 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1a610 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
1a620 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
1a630 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20  u32 nKey;.  u32 
1a640 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
1a650 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
1a660 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
1a670 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1a680 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
1a690 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1a6a0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1a6b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1a6c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1a6d0 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
1a6e0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1a6f0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
1a700 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1a710 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1a720 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1a730 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1a740 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
1a750 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
1a760 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b  ll;.  aPayload +
1a770 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  = pCur->info.nHe
1a780 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
1a790 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
1a7a0 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
1a7b0 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28  se{.    nKey = (
1a7c0 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
1a7d0 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
1a7e0 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
1a7f0 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
1a800 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
1a810 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
1a820 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
1a830 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
1a840 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
1a850 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
1a860 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
1a870 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
1a880 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
1a890 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
1a8a0 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
1a8b0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
1a8c0 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
1a8d0 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
1a8e0 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
1a8f0 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
1a900 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
1a910 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
1a920 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
1a930 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
1a940 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1a950 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
1a960 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
1a970 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
1a980 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
1a990 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
1a9a0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
1a9b0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
1a9c0 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
1a9d0 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
1a9e0 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
1a9f0 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
1aa00 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
1aa10 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
1aa20 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
1aa30 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
1aa40 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
1aa50 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
1aa60 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
1aa70 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
1aa80 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
1aa90 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
1aaa0 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
1aab0 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
1aac0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
1aad0 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
1aae0 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
1aaf0 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
1ab00 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
1ab10 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
1ab20 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
1ab30 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1ab40 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1ab50 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1ab60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ab70 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1ab80 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1ab90 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1aba0 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
1abb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f    return 0;.}.co
1abc0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1abd0 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
1abe0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1abf0 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
1ac00 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1ac10 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1ac20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1ac30 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1ac40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1ac50 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
1ac60 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
1ac70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 1);.  }.  r
1ac80 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
1ac90 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1aca0 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
1acb0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
1acc0 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
1acd0 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
1ace0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1acf0 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
1ad00 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve to..*/.static
1ad10 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
1ad20 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1ad30 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
1ad40 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
1ad50 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1ad60 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
1ad70 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
1ad80 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1ad90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1ada0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1adb0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1adc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1add0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1ade0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1adf0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
1ae00 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28  X_DEPTH );.  if(
1ae10 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
1ae20 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
1ae30 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
1ae40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1ae50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
1ae60 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
1ae70 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
1ae80 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66  &pNewPage);.  if
1ae90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1aea0 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
1aeb0 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
1aec0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
1aed0 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
1aee0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
1aef0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1af00 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1af10 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
1af20 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
1af30 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <1 ){.    return
1af40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1af50 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1af60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1af70 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1af80 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
1af90 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
1afa0 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
1afb0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
1afc0 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
1afd0 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
1afe0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
1aff0 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
1b000 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
1b010 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
1b020 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
1b030 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
1b040 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
1b050 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
1b060 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
1b070 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
1b080 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
1b090 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
1b0a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1b0b0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
1b0c0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
1b0d0 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
1b0e0 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73  o iChild){.  ass
1b0f0 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
1b100 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
1b110 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
1b120 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
1b130 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
1b140 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
1b150 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
1b160 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
1b170 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1b180 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
1b190 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
1b1a0 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
1b1b0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
1b1c0 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
1b1d0 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
1b1e0 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
1b1f0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1b200 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
1b210 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
1b220 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
1b230 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
1b240 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
1b250 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
1b260 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
1b270 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
1b280 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
1b290 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
1b2a0 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
1b2b0 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
1b2c0 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
1b2d0 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
1b2e0 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
1b2f0 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
1b300 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
1b310 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
1b320 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
1b330 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1b340 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1b350 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1b360 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1b370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1b380 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
1b390 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1b3a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1b3b0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
1b3c0 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
1b3d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1b3e0 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
1b3f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1b400 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
1b410 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1b420 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
1b430 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  .  );.  releaseP
1b440 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1b450 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
1b460 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
1b470 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1b480 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1b490 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1b4a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1b4b0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1b4c0 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61  root page.*/.sta
1b4d0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
1b4e0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
1b4f0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
1b500 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
1b510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
1b520 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
1b530 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
1b540 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1b550 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1b560 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1b570 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1b580 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
1b590 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1b5a0 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
1b5b0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
1b5c0 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
1b5d0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
1b5e0 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
1b5f0 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
1b600 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
1b610 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
1b620 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1b630 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1b640 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1b650 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 72  FAULT ){.      r
1b660 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
1b670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1b680 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1b690 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
1b6a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
1b6b0 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e>=0 ){.    int 
1b6c0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
1b6d0 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
1b6e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1b6f0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1b700 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
1b710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1b720 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f   .      SQLITE_O
1b730 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49  K!=(rc = getAndI
1b740 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
1b750 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
1b760 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 29 0a  ur->apPage[0])).
1b770 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75      ){.      pCu
1b780 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1b790 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1b7a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b7b0 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 6f 6f 74 20   }.  }..  pRoot 
1b7c0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
1b7d0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
1b7e0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
1b7f0 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 70 43  pgnoRoot );.  pC
1b800 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
1b810 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
1b820 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
1b830 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1b840 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
1b850 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1b860 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ey = 0;..  if( p
1b870 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
1b880 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
1b890 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
1b8a0 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ge;.    assert( 
1b8b0 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pRoot->pgno==1 )
1b8c0 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
1b8d0 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
1b8e0 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
1b8f0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1b900 20 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65   assert( subpage
1b910 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 );.    pCur->
1b920 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1b930 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
1b940 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1b950 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
1b960 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
1b970 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d  State = ((pRoot-
1b980 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52  >nCell>0)?CURSOR
1b990 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e  _VALID:CURSOR_IN
1b9a0 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65  VALID);.  }.  re
1b9b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b9c0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1b9d0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
1b9e0 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
1b9f0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
1ba00 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
1ba10 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
1ba20 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
1ba30 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
1ba40 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
1ba50 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
1ba60 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
1ba70 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
1ba80 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
1ba90 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
1baa0 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
1bab0 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
1bac0 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
1bad0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
1bae0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
1baf0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1bb00 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1bb10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1bb20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1bb30 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
1bb40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bb50 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
1bb60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1bb70 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
1bb80 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1bb90 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1bba0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1bbb0 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
1bbc0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1bbd0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
1bbe0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1bbf0 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
1bc00 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1bc10 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
1bc20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bc30 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1bc40 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
1bc50 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
1bc60 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
1bc70 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
1bc80 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
1bc90 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
1bca0 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
1bcb0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
1bcc0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
1bcd0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1bce0 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
1bcf0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1bd00 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
1bd10 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
1bd20 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
1bd30 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
1bd40 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
1bd50 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
1bd60 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
1bd70 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
1bd80 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
1bd90 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
1bda0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
1bdb0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
1bdc0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
1bdd0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1bde0 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
1bdf0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1be00 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
1be10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1be20 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
1be30 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
1be40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1be50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1be60 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1be70 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1be80 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
1be90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bea0 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
1beb0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1bec0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
1bed0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1bee0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1bef0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1bf00 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
1bf10 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1bf20 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
1bf30 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
1bf40 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1bf50 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
1bf60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bf70 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
1bf80 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
1bf90 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1bfa0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1bfb0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1bfc0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1bfd0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1bfe0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1bff0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1c000 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1c010 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1c020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1c030 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1c040 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1c050 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1c060 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1c070 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1c080 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1c090 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1c0a0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1c0b0 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
1c0c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1c0d0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1c0e0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1c0f0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1c100 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1c110 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c120 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1c130 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1c140 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1c150 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1c160 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c170 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1c180 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1c190 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1c1a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1c1b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1c1c0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
1c1d0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1c1e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c1f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1c200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c210 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1c220 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
1c230 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1c240 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1c250 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1c260 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1c270 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c280 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1c290 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
1c2a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1c2b0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1c2c0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1c2d0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1c2e0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1c2f0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1c300 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1c310 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1c320 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1c330 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1c340 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
1c350 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
1c360 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1c370 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
1c380 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1c390 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1c3a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c3b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1c3c0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1c3d0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1c3e0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1c3f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1c400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1c410 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1c420 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1c430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c440 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1c450 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
1c460 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
1c470 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
1c480 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1c490 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1c4a0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1c4b0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1c4c0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1c4d0 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1c4e0 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1c4f0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1c500 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72  pCur->atLast = r
1c510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a  c==SQLITE_OK ?1:
1c520 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1c530 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1c540 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1c550 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
1c560 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
1c570 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
1c580 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
1c590 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
1c5a0 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
1c5b0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
1c5c0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
1c5d0 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
1c5e0 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
1c5f0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
1c600 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
1c610 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
1c620 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
1c630 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
1c640 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
1c650 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
1c660 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
1c670 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1c680 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
1c690 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
1c6a0 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
1c6b0 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
1c6c0 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
1c6d0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
1c6e0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
1c6f0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
1c700 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
1c710 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
1c720 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ey..**.** The re
1c730 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
1c740 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
1c750 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
1c760 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  h the.** cursor 
1c770 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
1c780 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c  Res if pRes!=NUL
1c790 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  L.  The meaning 
1c7a0 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65  of.** this value
1c7b0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1c7c0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
1c7d0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1c7e0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1c7f0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1c800 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1c810 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
1c820 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20  er than pKey or 
1c830 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1c840 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
1c850 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
1c860 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
1c870 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
1c880 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
1c890 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
1c8a0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1c8b0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1c8c0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1c8d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1c8e0 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
1c8f0 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a  ches pKey..**.**
1c900 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
1c910 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1c920 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1c930 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1c940 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c950 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
1c960 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  n pKey..**.*/.in
1c970 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1c980 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
1c990 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1c9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c9b0 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
1c9c0 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
1c9d0 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
1c9e0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
1c9f0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
1ca00 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
1ca10 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
1ca20 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
1ca30 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
1ca40 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1ca50 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
1ca60 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
1ca70 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca90 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
1caa0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
1cab0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1cac0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1cad0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1cae0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1caf0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1cb00 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1cb10 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
1cb20 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1cb30 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
1cb40 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
1cb50 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
1cb60 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
1cb70 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1cb80 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1cb90 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
1cba0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1cbb0 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
1cbc0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
1cbd0 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
1cbe0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
1cbf0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1cc00 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
1cc10 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1cc20 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1cc30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1cc40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1cc50 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
1cc60 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
1cc70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
1cc80 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
1cc90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1cca0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
1ccb0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1ccc0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
1ccd0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1cce0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1ccf0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1cd00 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
1cd10 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1cd20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1cd30 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1cd40 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1cd50 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1cd60 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1cd70 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1cd80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1cd90 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
1cda0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1cdb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1cdc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1cdd0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
1cde0 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
1cdf0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
1ce00 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
1ce10 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
1ce20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1ce30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1ce40 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
1ce50 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70  nt c = -1;  /* p
1ce60 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61  Res return if ta
1ce70 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73  ble is empty mus
1ce80 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c  t be -1 */.    l
1ce90 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
1cea0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1ceb0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1cec0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64 78  ->intKey && pIdx
1ced0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
1cee0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1cef0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1cf00 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1cf10 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  sh;.    }.    if
1cf20 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20  ( biasRight ){. 
1cf30 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
1cf40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
1cf50 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65  (u16)upr;.    }e
1cf60 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
1cf70 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1cf80 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72  ge] = (u16)((upr
1cf90 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +lwr)/2);.    }.
1cfa0 20 20 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72      if( lwr<=upr
1cfb0 20 29 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20   ) for(;;){.    
1cfc0 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
1cfd0 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c  ;.      i64 nCel
1cfe0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  lKey;.      int 
1cff0 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
1d000 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
1d010 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1d020 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1d030 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1d040 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  y = 1;.      if(
1d050 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1d060 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43  {.        u8 *pC
1d070 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
1d080 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1d090 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
1d0a0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
1d0b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1d0c0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
1d0d0 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
1d0e0 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
1d0f0 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
1d100 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29  32(pCell, dummy)
1d110 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d120 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
1d130 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
1d140 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
1d150 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  f( nCellKey==int
1d160 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1d170 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
1d180 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
1d190 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
1d1a0 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20         c = -1;. 
1d1b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d1c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d1d0 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
1d1e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
1d1f0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1d200 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d210 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c      int availabl
1d220 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e;.        pCell
1d230 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65  Key = (void *)fe
1d240 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
1d250 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b   &available, 0);
1d260 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65  .        nCellKe
1d270 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
1d280 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
1d290 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c   available>=nCel
1d2a0 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  lKey ){.        
1d2b0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
1d2c0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 28  eRecordCompare((
1d2d0 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  int)nCellKey, pC
1d2e0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
1d2f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1d300 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
1d310 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
1d320 6c 6f 63 28 20 28 69 6e 74 29 6e 43 65 6c 6c 4b  loc( (int)nCellK
1d330 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
1d340 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
1d350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1d360 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1d370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1d380 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1d390 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d3a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d3b0 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75  ite3BtreeKey(pCu
1d3c0 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c  r, 0, (int)nCell
1d3d0 4b 65 79 2c 20 28 76 6f 69 64 2a 29 70 43 65 6c  Key, (void*)pCel
1d3e0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1d3f0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
1d400 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 28 69  RecordCompare((i
1d410 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65  nt)nCellKey, pCe
1d420 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
1d430 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1d440 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
1d450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1d460 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
1d470 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
1d480 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1d490 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
1d4a0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1d4b0 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
1d4c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1d4d0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
1d4e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1d4f0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
1d500 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70  dx;.          up
1d510 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20  r = lwr - 1;.   
1d520 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d530 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d540 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20         if( pRes 
1d550 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20  ) *pRes = 0;.   
1d560 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1d570 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1d580 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1d590 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
1d5a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1d5b0 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
1d5c0 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
1d5d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d5e0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
1d5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1d600 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20   lwr>upr ){.    
1d610 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1d620 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
1d630 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
1d650 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1d660 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 6c  Page] = (u16)((l
1d670 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20  wr+upr)/2);.    
1d680 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
1d690 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20  r==upr+1 );.    
1d6a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1d6b0 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
1d6c0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1d6d0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
1d6e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1d6f0 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
1d700 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
1d710 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
1d720 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1d730 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1d740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d750 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1d760 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1d770 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
1d780 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
1d790 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1d7a0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1d7b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1d7c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1d7d0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1d7e0 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20  .      if( pRes 
1d7f0 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20  ) *pRes = c;.   
1d800 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d810 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
1d820 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1d830 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
1d840 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
1d850 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
1d860 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1d870 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
1d880 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1d890 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1d8a0 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
1d8b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1d8c0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1d8d0 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  sh;.  }.moveto_f
1d8e0 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20  inish:.  return 
1d8f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20  rc;.}../*.** In 
1d900 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  this version of 
1d910 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65  BtreeMoveto, pKe
1d920 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e  y is a packed in
1d930 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75  dex record.** su
1d940 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74  ch as is generat
1d950 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
1d960 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20  eRecord opcode. 
1d970 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72   Unpack the.** r
1d980 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63  ecord and then c
1d990 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55  all BtreeMovetoU
1d9a0 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20  npacked() to do 
1d9b0 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74  the work..*/.int
1d9c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1d9d0 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20  eto(.  BtCursor 
1d9e0 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75  *pCur,     /* Cu
1d9f0 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  rsor open on the
1da00 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61   btree to be sea
1da10 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  rched */.  const
1da20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
1da30 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20  * Packed key if 
1da40 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20  the btree is an 
1da50 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e  index */.  i64 n
1da60 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
1da70 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  * Integer key fo
1da80 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20  r tables.  Size 
1da90 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69  of pKey for indi
1daa0 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  ces */.  int bia
1dab0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
1dac0 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74  Bias search to t
1dad0 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
1dae0 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
1daf0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
1db00 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
1db10 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1db20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1db30 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63       /* Status c
1db40 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ode */.  Unpacke
1db50 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
1db60 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ;   /* Unpacked 
1db70 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 55  index key */.  U
1db80 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 61 53  npackedRecord aS
1db90 70 61 63 65 5b 31 36 5d 3b 20 2f 2a 20 54 65 6d  pace[16]; /* Tem
1dba0 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78  p space for pIdx
1dbb0 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  Key - to avoid a
1dbc0 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66   malloc */..  if
1dbd0 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
1dbe0 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
1dbf0 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
1dc00 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
1dc10 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1dc20 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
1dc30 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
1dc40 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61 63             aSpac
1dc70 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65  e, sizeof(aSpace
1dc80 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  ));.    if( pIdx
1dc90 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
1dca0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1dcb0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
1dcc0 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
1dcd0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
1dce0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
1dcf0 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
1dd00 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
1dd10 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
1dd20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
1dd30 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
1dd40 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a  d(pIdxKey);.  }.
1dd50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dd60 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1dd70 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
1dd80 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
1dd90 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
1dda0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
1ddb0 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
1ddc0 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
1ddd0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
1dde0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
1ddf0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
1de00 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
1de10 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
1de20 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
1de30 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
1de40 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
1de50 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
1de60 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1de70 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1de80 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
1de90 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1dea0 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
1deb0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1dec0 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
1ded0 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
1dee0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
1def0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
1df00 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
1df10 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
1df20 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
1df30 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
1df40 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
1df50 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
1df60 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
1df70 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
1df80 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
1df90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1dfa0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1dfb0 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f  ection handle fo
1dfc0 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  r a cursor..*/.s
1dfd0 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 42  qlite3 *sqlite3B
1dfe0 74 72 65 65 43 75 72 73 6f 72 44 62 28 63 6f 6e  treeCursorDb(con
1dff0 73 74 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st BtCursor *pCu
1e000 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  r){.  assert( sq
1e010 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1e020 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1e030 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1e040 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72  eturn pCur->pBtr
1e050 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee->db;.}../*.**
1e060 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
1e070 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
1e080 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1e090 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
1e0a0 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
1e0b0 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
1e0c0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
1e0d0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
1e0e0 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
1e0f0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1e100 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
1e110 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
1e120 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
1e130 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
1e140 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1e150 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1e160 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1e170 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
1e180 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1e190 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
1e1a0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1e1b0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1e1c0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
1e1d0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
1e1e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e1f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1e200 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
1e210 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66   pRes!=0 );.  if
1e220 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1e230 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1e240 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
1e250 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e260 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1e270 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b   pCur->skip>0 ){
1e280 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
1e290 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
1e2a0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1e2b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1e2c0 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1e2d0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1e2e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1e2f0 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
1e300 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1e310 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
1e320 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
1e330 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t );.  assert( i
1e340 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx<=pPage->nCell
1e350 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66   );..  pCur->inf
1e360 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1e370 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1e380 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70   0;.  if( idx>=p
1e390 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
1e3a0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1e3b0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
1e3c0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1e3d0 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
1e3e0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1e3f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
1e400 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1e410 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e420 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1e430 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1e440 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1e450 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e460 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
1e470 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
1e480 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
1e490 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1e4a0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1e4b0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1e4c0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
1e4d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e4e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e4f0 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
1e500 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
1e510 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
1e520 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1e530 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
1e540 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1e550 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
1e560 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
1e570 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
1e580 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1e590 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1e5a0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
1e5b0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
1e5c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1e5d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e5e0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
1e5f0 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
1e600 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ;.  if( pPage->l
1e610 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
1e620 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1e630 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65  .  rc = moveToLe
1e640 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1e650 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1e660 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
1e670 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
1e680 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
1e690 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1e6a0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
1e6b0 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
1e6c0 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
1e6d0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
1e6e0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
1e6f0 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
1e700 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1e710 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
1e720 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1e730 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
1e740 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
1e750 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
1e760 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
1e770 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1e780 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
1e790 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1e7a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1e7b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1e7c0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1e7d0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1e7e0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1e7f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e800 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e810 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  }.  pCur->atLast
1e820 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53   = 0;.  if( CURS
1e830 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1e840 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1e850 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1e860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e870 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
1e880 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70  >skip<0 ){.    p
1e890 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
1e8a0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1e8b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e8c0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
1e8d0 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
1e8e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1e8f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
1e900 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1e910 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
1e920 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1e930 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
1e940 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1e950 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
1e960 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1e970 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
1e980 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
1e990 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
1e9a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e9b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1e9c0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
1e9d0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
1e9e0 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
1e9f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1ea00 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20  iPage]==0 ){.   
1ea10 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
1ea20 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
1ea30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1ea40 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1ea50 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
1ea60 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
1ea70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1ea80 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1ea90 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
1eaa0 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
1eab0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
1eac0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
1ead0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1eae0 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   0;..    pCur->a
1eaf0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1eb00 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
1eb10 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1eb20 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
1eb30 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1eb40 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
1eb50 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1eb60 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1eb70 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
1eb80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1eb90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1eba0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  K;.    }.  }.  *
1ebb0 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
1ebc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ebd0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
1ebe0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
1ebf0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1ec00 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
1ec10 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
1ec20 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
1ec30 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
1ec40 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
1ec50 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1ec60 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
1ec70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
1ec80 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
1ec90 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
1eca0 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
1ecb0 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
1ecc0 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
1ecd0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
1ece0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
1ecf0 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
1ed00 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
1ed10 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1ed20 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
1ed30 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
1ed40 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
1ed50 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
1ed60 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
1ed70 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
1ed80 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
1ed90 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
1eda0 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
1edb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1edc0 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
1edd0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
1ede0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
1edf0 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
1ee00 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
1ee10 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29   then a (feeble)
1ee20 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
1ee30 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
1ee40 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
1ee50 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
1ee60 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
1ee70 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
1ee80 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
1ee90 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
1eea0 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
1eeb0 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
1eec0 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
1eed0 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
1eee0 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
1eef0 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
1ef00 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74  ** If the "exact
1ef10 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
1ef20 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61  ot 0, and the pa
1ef30 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79  ge-number nearby
1ef40 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77   exists .** anyw
1ef50 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
1ef60 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
1ef70 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
1ef80 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
1ef90 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65  s.** is only use
1efa0 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1efb0 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20   databases when 
1efc0 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
1efd0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1efe0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
1eff0 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
1f000 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
1f010 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
1f020 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
1f030 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
1f040 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
1f050 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
1f060 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1f070 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
1f080 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1f090 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
1f0a0 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt k;     /* Num
1f0b0 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
1f0c0 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
1f0d0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
1f0e0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
1f0f0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1f100 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
1f110 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f120 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1f130 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
1f140 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1f150 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  ge1;.  n = get4b
1f160 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1f170 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e  ta[36]);.  if( n
1f180 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
1f190 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
1f1a0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
1f1b0 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
1f1c0 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
1f1d0 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
1f1e0 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
1f1f0 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
1f200 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
1f210 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
1f220 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
1f230 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
1f240 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
1f250 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
1f260 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
1f270 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
1f280 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
1f290 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
1f2a0 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
1f2b0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
1f2c0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
1f2d0 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
1f2e0 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
1f2f0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
1f300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f310 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1f320 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
1f330 62 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  by<=pagerPagecou
1f340 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
1f350 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
1f360 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
1f370 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1f380 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1f390 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  um );.      rc =
1f3a0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
1f3b0 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
1f3c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1f3d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f3e0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1f3f0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1f400 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  {.        search
1f410 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
1f420 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d  }.      *pPgno =
1f430 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23   nearby;.    }.#
1f440 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
1f450 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
1f460 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
1f470 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
1f480 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1f490 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
1f4a0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
1f4b0 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
1f4c0 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
1f4d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1f4e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f4f0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1f500 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1f510 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
1f520 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1f530 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
1f540 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1f550 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
1f560 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
1f570 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
1f580 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
1f590 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
1f5a0 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
1f5b0 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
1f5c0 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
1f5d0 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
1f5e0 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
1f5f0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
1f600 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20  ' is located..  
1f610 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
1f620 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
1f630 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
1f640 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
1f650 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
1f660 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
1f670 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
1f680 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f690 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
1f6a0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1f6b0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
1f6c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1f6d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1f6e0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
1f6f0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
1f700 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1f710 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1f720 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
1f730 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1f740 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
1f750 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
1f760 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
1f770 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
1f780 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
1f790 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
1f7a0 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
1f7b0 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
1f7c0 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
1f7d0 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
1f7e0 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
1f7f0 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
1f800 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
1f810 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
1f820 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
1f830 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
1f840 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1f850 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
1f860 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f870 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f880 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1f890 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1f8a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1f8b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1f8c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1f8d0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
1f8e0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
1f8f0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
1f900 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
1f910 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1f920 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
1f930 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
1f940 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1f950 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1f960 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
1f970 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
1f980 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
1f990 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
1f9a0 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74   }else if( k>pBt
1f9b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
1f9c0 20 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   2 ){.        /*
1f9d0 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
1f9e0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
1f9f0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1fa00 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
1fa10 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1fa20 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
1fa30 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1fa40 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
1fa50 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1fa60 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
1fa70 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
1fa80 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75   && nearby==iTru
1fa90 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
1faa0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
1fab0 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
1fac0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
1fad0 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
1fae0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
1faf0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
1fb00 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
1fb10 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
1fb20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
1fb30 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75  rt( *pPgno==iTru
1fb40 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  nk );.        *p
1fb50 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
1fb60 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1fb70 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1fb80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fb90 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1fba0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1fbb0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1fbc0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1fbd0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1fbe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1fbf0 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
1fc00 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
1fc10 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1fc20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1fc30 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
1fc40 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1fc50 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1fc60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1fc70 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
1fc80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1fc90 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1fca0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1fcb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1fcc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1fcd0 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
1fce0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
1fcf0 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
1fd00 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
1fd10 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
1fd20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
1fd30 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
1fd40 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
1fd50 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
1fd60 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
1fd70 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
1fd80 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
1fd90 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
1fda0 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
1fdb0 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
1fdc0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1fdd0 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
1fde0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1fdf0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1fe00 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
1fe10 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
1fe20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fe30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fe40 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1fe50 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1fe60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fe70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fe80 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
1fe90 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1fea0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1feb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fec0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1fed0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
1fee0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1fef0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1ff00 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1ff10 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
1ff20 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
1ff30 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1ff40 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1ff50 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1ff60 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
1ff70 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
1ff80 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1ff90 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1ffa0 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
1ffb0 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
1ffc0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
1ffd0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
1ffe0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1fff0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
20000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
20010 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
20020 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
20030 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
20040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
20050 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
20060 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
20070 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
20080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20090 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
200a0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
200b0 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
200c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
200d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
200e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
200f0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
20100 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20110 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
20120 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
20130 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
20140 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
20150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20160 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
20170 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
20180 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
20190 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
201a0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
201b0 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
201c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
201d0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
201e0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
201f0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
20200 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20   int closest;.  
20210 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
20220 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
20230 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
20240 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
20250 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20260 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
20270 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
20280 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
20290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
202a0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
202b0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
202c0 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
202d0 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
202e0 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20   int i, dist;.  
202f0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
20300 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
20310 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
20320 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
20330 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  by;.          if
20340 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20  ( dist<0 ) dist 
20350 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20  = -dist;.       
20360 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
20370 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
20380 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34     int d2 = get4
20390 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
203a0 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  4]) - nearby;.  
203b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
203c0 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20  <0 ) d2 = -d2;. 
203d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
203e0 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
203f0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
20400 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
20410 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
20420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20450 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
20460 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
20470 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
20480 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
20490 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
204a0 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
204b0 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
204c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
204d0 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20  no nPage;.      
204e0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
204f0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50  ge;.          nP
20500 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
20510 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 20  ount(pBt);.     
20520 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e       if( *pPgno>
20530 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  nPage ){.       
20540 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
20550 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
20560 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
20570 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
20580 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20590 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
205a0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
205b0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
205c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
205d0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
205e0 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
205f0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
20600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20610 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
20620 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
20640 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
20650 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
20660 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
20670 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
20680 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
20690 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
206a0 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
206b0 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
206c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
206d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
206e0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
206f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
20700 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
20710 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b  writeable(pTrunk
20720 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
20730 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20740 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
20750 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
20760 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  Page, 1);.      
20770 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20780 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20790 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
207a0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a  rDontRollback((*
207b0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
207c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
207d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
207e0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
207f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
20800 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
20810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20820 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
20830 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
20840 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
20850 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20860 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
20870 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
20880 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
20890 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
208a0 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
208b0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
208c0 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
208d0 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
208e0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
208f0 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
20900 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61  reelist, so crea
20910 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74  te a new page at
20920 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
20930 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
20940 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 70     int nPage = p
20950 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
20960 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  t);.    *pPgno =
20970 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 23 69 66   nPage + 1;..#if
20980 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20990 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
209a0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
209b0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
209c0 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f  PAGE(pBt, *pPgno
209d0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
209e0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
209f0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
20a00 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
20a10 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
20a20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
20a30 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
20a40 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
20a50 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
20a60 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
20a70 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
20a80 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
20a90 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
20aa0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
20ab0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20ac0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
20ad0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
20ae0 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
20af0 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50  ap page)\n", *pP
20b00 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73  gno));.      ass
20b10 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
20b20 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
20b30 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70  Bt) );.      (*p
20b40 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69  Pgno)++;.      i
20b50 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
20b60 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
20b70 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b  ) ){ (*pPgno)++;
20b80 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
20b90 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
20ba0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
20bb0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
20bc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
20bd0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
20be0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
20bf0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
20c00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
20c10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20c20 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
20c30 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
20c40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20c50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
20c60 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
20c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
20c80 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
20c90 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
20ca0 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
20cb0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
20cc0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
20cd0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
20ce0 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
20cf0 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
20d00 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
20d10 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
20d20 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d  runk);.  if( rc=
20d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20d40 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
20d50 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
20d60 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
20d70 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
20d80 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
20d90 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
20da0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
20db0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
20dc0 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
20dd0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
20de0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20df0 20 41 64 64 20 61 20 70 61 67 65 20 6f 66 20 74   Add a page of t
20e00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20e10 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
20e20 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ..**.** sqlite3P
20e30 61 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e  agerUnref() is N
20e40 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50  OT called for pP
20e50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
20e60 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  nt freePage(MemP
20e70 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42  age *pPage){.  B
20e80 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20e90 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d  Page->pBt;.  Mem
20ea0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
20eb0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e  Bt->pPage1;.  in
20ec0 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f  t rc, n, k;..  /
20ed0 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 70 61  * Prepare the pa
20ee0 67 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a  ge for freeing *
20ef0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
20f00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20f10 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
20f20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
20f30 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
20f40 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
20f50 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  = 0;..  /* Incre
20f60 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
20f70 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
20f80 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
20f90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
20fa0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
20fb0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
20fc0 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74  rn rc;.  n = get
20fd0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
20fe0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
20ff0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
21000 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a  Data[36], n+1);.
21010 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
21020 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
21030 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
21040 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f  SECURE_DELETE co
21050 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
21060 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
21070 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  en.  ** always f
21080 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
21090 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
210a0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
210b0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
210c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
210d0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
210e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
210f0 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61  rc;.  memset(pPa
21100 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
21110 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
21120 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
21130 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
21140 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
21150 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
21160 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
21170 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
21180 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
21190 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
211a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
211b0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
211c0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
211d0 70 42 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  pBt, pPage->pgno
211e0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
211f0 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
21200 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
21210 20 7d 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29   }..  if( n==0 )
21220 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
21230 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
21240 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  page */.    rc =
21250 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
21260 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
21270 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
21280 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21290 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
212a0 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ata, 0, 8);.    
212b0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
212c0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61  ->aData[32], pPa
212d0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54  ge->pgno);.    T
212e0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
212f0 3a 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70  : %d first\n", p
21300 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
21310 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74  }else{.    /* Ot
21320 68 65 72 20 66 72 65 65 20 70 61 67 65 73 20 61  her free pages a
21330 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 20 52  lready exist.  R
21340 65 74 72 69 76 65 20 74 68 65 20 66 69 72 73 74  etrive the first
21350 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
21360 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ** of the freeli
21370 73 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20  st and find out 
21380 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20  how many leaves 
21390 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d  it has. */.    M
213a0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a  emPage *pTrunk;.
213b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
213c0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
213d0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
213e0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20  e1->aData[32]), 
213f0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
21400 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
21410 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74   rc;.    k = get
21420 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
21430 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66  Data[4]);.    if
21440 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ( k>=pBt->usable
21450 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
21460 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
21470 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20   is full.  Turn 
21480 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
21490 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a  reed into a new.
214a0 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70        ** trunk p
214b0 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76  age with no leav
214c0 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  es..      **.   
214d0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
214e0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
214f0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
21500 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
21510 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
21520 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
21530 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
21540 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
21550 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
21560 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
21570 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
21580 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
21590 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
215a0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
215b0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
215c0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
215d0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
215e0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
215f0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
21600 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
21610 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
21620 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
21630 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
21640 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
21650 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
21660 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
21670 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
21680 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
21690 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20  will contain to 
216a0 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
216b0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
216c0 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
216d0 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
216e0 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
216f0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
21700 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
21710 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
21720 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
21730 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
21740 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
21750 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
21760 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
21770 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
21780 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
21790 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
217a0 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
217b0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
217c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
217d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
217e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
217f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21800 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
21810 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b  e->aData, pTrunk
21820 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
21830 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
21840 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
21850 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
21860 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
21870 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
21880 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
21890 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
218a0 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
218b0 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
218c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
218d0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54   pPage->pgno, pT
218e0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
218f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
21900 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20 20 20 20  if( k<0 ){.     
21910 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
21920 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RUPT;.    }else{
21930 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  .      /* Add th
21940 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61  e newly freed pa
21950 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20  ge as a leaf on 
21960 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e  the current trun
21970 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  k */.      rc = 
21980 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
21990 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
219a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
219b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
219c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
219d0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
219e0 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20 20  ], k+1);.       
219f0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
21a00 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c  k->aData[8+k*4],
21a10 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23   pPage->pgno);.#
21a20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45  ifndef SQLITE_SE
21a30 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
21a40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21a50 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
21a60 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
21a70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
21a80 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
21a90 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
21aa0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
21ab0 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
21ac0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
21ad0 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
21ae0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
21af0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21b00 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
21b10 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
21b20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21b30 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
21b40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
21b50 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
21b60 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
21b70 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
21b80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21b90 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
21ba0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
21bb0 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
21bc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
21bd0 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66  nOvfl;.  int ovf
21be0 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
21bf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21c00 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
21c10 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
21c20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
21c30 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
21c40 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
21c50 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
21c60 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
21c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21c80 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
21c90 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
21ca0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
21cb0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f  thing */.  }.  o
21cc0 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
21cd0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
21ce0 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76  Overflow]);.  ov
21cf0 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
21d00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
21d10 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
21d20 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
21d30 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
21d40 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
21d50 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
21d60 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
21d70 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
21d80 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
21d90 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
21da0 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f  pOvfl;.    if( o
21db0 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76  vflPgno==0 || ov
21dc0 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  flPgno>pagerPage
21dd0 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
21de0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21df0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21e00 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
21e10 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
21e20 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
21e30 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30  pOvfl, (nOvfl==0
21e40 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a  )?0:&ovflPgno);.
21e50 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
21e60 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
21e70 20 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29   freePage(pOvfl)
21e80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
21e90 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
21ea0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
21eb0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
21ec0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
21ed0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21ee0 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
21ef0 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
21f00 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
21f10 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
21f20 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
21f30 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
21f40 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
21f50 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
21f60 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
21f70 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
21f80 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
21f90 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
21fa0 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
21fb0 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
21fc0 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
21fd0 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
21fe0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
21ff0 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
22000 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
22010 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
22020 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
22030 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
22040 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
22050 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
22060 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
22070 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
22080 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
22090 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
220a0 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
220b0 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
220c0 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
220d0 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
220e0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
220f0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
22100 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
22110 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
22120 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
22130 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
22140 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
22150 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
22160 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
22170 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
22180 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
22190 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
221a0 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
221b0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
221c0 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
221d0 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
221e0 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22200 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
22210 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
22220 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
22230 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
22240 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
22250 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
22260 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
22270 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
22280 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
22290 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
222a0 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
222b0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
222c0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
222d0 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
222e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
222f0 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
22300 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
22310 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
22320 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
22330 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
22340 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
22350 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  er;.  CellInfo i
22360 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
22370 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
22380 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
22390 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
223a0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
223b0 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
223c0 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
223d0 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
223e0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
223f0 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
22400 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
22410 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
22420 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
22430 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
22440 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
22450 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
22460 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
22470 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
22480 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
22490 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
224a0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
224b0 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
224c0 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66  Header = 0;.  if
224d0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
224e0 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
224f0 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   4;.  }.  if( pP
22500 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
22510 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
22520 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
22530 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b  nHeader], nData+
22540 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  nZero);.  }else{
22550 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65  .    nData = nZe
22560 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48  ro = 0;.  }.  nH
22570 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
22580 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
22590 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79  r], *(u64*)&nKey
225a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
225b0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
225c0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
225d0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  o);.  assert( in
225e0 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61  fo.nHeader==nHea
225f0 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  der );.  assert(
22600 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
22610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
22620 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28  fo.nData==(u32)(
22630 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a  nData+nZero) );.
22640 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
22650 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
22660 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
22670 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
22680 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
22690 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
226a0 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
226b0 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
226c0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
226d0 20 20 20 2f 2a 20 54 42 44 3a 20 20 50 65 72 68     /* TBD:  Perh
226e0 61 70 73 20 72 61 69 73 65 20 53 51 4c 49 54 45  aps raise SQLITE
226f0 5f 43 4f 52 52 55 50 54 20 69 66 20 6e 4b 65 79  _CORRUPT if nKey
22700 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
22710 33 31 20 62 69 74 73 3f 20 2a 2f 0a 20 20 20 20  31 bits? */.    
22720 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74  nPayload += (int
22730 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
22740 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
22750 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
22760 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  }.  *pnSize = in
22770 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63  fo.nSize;.  spac
22780 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f  eLeft = info.nLo
22790 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20  cal;.  pPayload 
227a0 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
227b0 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  ];.  pPrior = &p
227c0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
227d0 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  low];..  while( 
227e0 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
227f0 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
22800 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
22810 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
22820 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
22830 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
22840 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
22850 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
22860 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
22870 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
22880 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
22890 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
228a0 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
228b0 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
228c0 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
228d0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
228e0 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
228f0 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
22900 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
22910 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
22920 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
22930 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
22940 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
22950 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
22960 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
22970 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22980 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
22990 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
229a0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
229b0 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
229c0 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
229d0 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
229e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
229f0 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
22a00 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
22a10 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
22a20 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
22a30 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
22a40 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22a50 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
22a60 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
22a70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
22a80 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
22a90 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
22aa0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
22ab0 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
22ac0 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
22ad0 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
22ae0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
22af0 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
22b00 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
22b10 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
22b20 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
22b30 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
22b40 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
22b50 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
22b60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
22b70 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
22b80 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
22b90 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
22ba0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
22bb0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
22bc0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
22bd0 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
22be0 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
22bf0 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
22c00 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OW1);.        rc
22c10 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
22c20 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
22c30 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a  e, pgnoPtrmap);.
22c40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
22c50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
22c60 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
22c70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22c80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
22c90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
22ca0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
22cb0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
22cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
22cd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
22ce0 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
22cf0 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
22d00 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
22d10 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
22d20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
22d30 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
22d40 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
22d50 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
22d60 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
22d70 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
22d80 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
22d90 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
22da0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
22db0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
22dc0 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
22dd0 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
22de0 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
22df0 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
22e00 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
22e10 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
22e20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
22e30 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
22e40 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
22e50 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
22e60 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
22e70 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
22e80 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
22e90 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
22ea0 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
22eb0 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
22ec0 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
22ed0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
22ee0 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
22ef0 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
22f00 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
22f10 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
22f20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
22f30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
22f40 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
22f50 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
22f60 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
22f70 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
22f80 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
22f90 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
22fa0 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
22fb0 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
22fc0 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
22fd0 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
22fe0 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
22ff0 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
23000 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
23010 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
23020 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
23030 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
23040 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
23050 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
23060 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
23070 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
23080 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
23090 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
230a0 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
230b0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
230c0 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
230d0 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
230e0 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
230f0 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
23100 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
23110 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
23120 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
23130 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
23140 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
23150 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
23160 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
23170 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
23180 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
23190 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
231a0 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
231b0 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
231c0 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
231d0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
231e0 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
231f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
23200 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
23210 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
23220 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
23230 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
23240 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
23250 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
23260 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
23270 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
23280 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
23290 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
232a0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
232b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
232c0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
232d0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
232e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
232f0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
23300 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
23310 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
23320 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
23330 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
23340 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
23350 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
23360 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
23370 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
23380 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
23390 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
233a0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
233b0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
233c0 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
233d0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
233e0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
233f0 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
23400 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
23410 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
23420 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
23430 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  nt dropCell(MemP
23440 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
23450 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20  idx, int sz){.  
23460 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
23470 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
23480 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
23490 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
234a0 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
234b0 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
234c0 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
234d0 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
234e0 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
234f0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
23500 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
23510 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
23520 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
23530 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
23540 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
23550 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
23560 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
23570 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
23580 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
23590 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
235a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
235b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
235c0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
235d0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
235e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
235f0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
23600 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
23610 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
23620 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61  a;.  ptr = &data
23630 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
23640 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70  et + 2*idx];.  p
23650 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
23660 29 3b 0a 20 20 69 66 28 20 28 70 63 3c 70 50 61  );.  if( (pc<pPa
23670 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
23680 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
23690 29 29 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b 73  )).     || (pc+s
236a0 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  z>pPage->pBt->us
236b0 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  ableSize) ){.   
236c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
236d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
236e0 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
236f0 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
23700 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
23710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
23720 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 6f  urn rc;.  }.  fo
23730 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
23740 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
23750 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
23760 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
23770 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
23780 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
23790 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
237a0 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
237b0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
237c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
237d0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
237e0 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  2;.  return SQLI
237f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23800 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
23810 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
23820 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
23830 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
23840 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
23850 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
23860 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
23870 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
23880 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
23890 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
238a0 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
238b0 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
238c0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
238d0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
238e0 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
238f0 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
23900 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
23910 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
23920 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
23930 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61  pPage->aOvfl[] a
23940 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
23950 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
23960 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
23970 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
23980 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
23990 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
239a0 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
239b0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
239c0 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
239d0 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
239e0 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
239f0 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
23a00 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
23a10 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  If nSkip is non-
23a20 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  zero, then do no
23a30 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74  t copy the first
23a40 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
23a50 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  the.** cell. The
23a60 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65   caller will ove
23a70 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65  rwrite them afte
23a80 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
23a90 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e  returns. If.** n
23aa0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
23ab0 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79  , then pCell may
23ac0 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
23ad0 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   invalid memory 
23ae0 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75  location .** (bu
23af0 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73  t pCell+nSkip is
23b00 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a   always valid)..
23b10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
23b20 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
23b30 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
23b40 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
23b50 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
23b60 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
23b70 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
23b80 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
23b90 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
23ba0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
23bb0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
23bc0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
23bd0 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
23be0 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
23bf0 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
23c00 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
23c10 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
23c20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
23c30 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
23c40 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
23c50 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20    u8 nSkip      
23c60 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72      /* Do not wr
23c70 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6e 53  ite the first nS
23c80 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
23c90 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   cell */.){.  in
23ca0 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
23cb0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
23cc0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
23cd0 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
23ce0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
23cf0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
23d00 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ter */.  int top
23d10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
23d20 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74  rst byte of cont
23d30 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c  ent for any cell
23d40 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
23d50 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
23d60 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
23d70 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
23d80 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
23d90 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
23da0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
23db0 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
23dc0 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
23dd0 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
23de0 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  d */.  int hdr; 
23df0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
23e00 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f  et into data[] o
23e10 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  f the page heade
23e20 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  r */.  int cellO
23e30 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
23e40 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
23e50 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
23e60 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
23e70 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
23e80 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
23e90 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
23ea0 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
23eb0 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d     /* Used for m
23ec0 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  oving informatio
23ed0 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61  n around in data
23ee0 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
23ef0 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
23f00 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
23f10 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
23f20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
23f30 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
23f40 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
23f50 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
23f60 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72  =5460 );.  asser
23f70 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
23f80 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
23f90 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a  Page->aOvfl) );.
23fa0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
23fb0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
23fc0 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73   pCell) );.  ass
23fd0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23fe0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
23ff0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
24000 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
24010 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
24020 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
24030 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
24040 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
24050 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
24060 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
24070 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
24080 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  emp;.    }.    j
24090 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
240a0 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
240b0 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f  t( j<(int)(sizeo
240c0 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f  f(pPage->aOvfl)/
240d0 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
240e0 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
240f0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
24100 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
24110 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
24120 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b  j].idx = (u16)i;
24130 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
24140 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
24150 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
24160 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24170 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
24180 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
241a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
241b0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
241c0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
241d0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
241e0 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
241f0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
24200 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
24210 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
24220 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
24230 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
24240 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
24250 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
24260 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
24270 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
24280 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20  ->nCell + 2;.   
24290 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
242a0 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28  t + 2*i;.    if(
242b0 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20   end > top - sz 
242c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65  ){.      rc = de
242d0 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
242e0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
242f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24300 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
24310 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
24320 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
24330 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
24340 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64       assert( end
24350 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a   + sz <= top );.
24360 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20      }.    idx = 
24370 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
24380 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73  age, sz);.    as
24390 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20  sert( idx>0 );. 
243a0 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c     assert( end <
243b0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
243c0 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20  [hdr+5]) );.    
243d0 69 66 20 28 69 64 78 2b 73 7a 20 3e 20 70 50 61  if (idx+sz > pPa
243e0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
243f0 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 72 65 74  ize) {.      ret
24400 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
24410 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
24420 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
24430 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
24440 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65  ree -= 2;.    me
24450 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
24460 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
24470 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
24480 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20     for(j=end-2, 
24490 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
244a0 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
244b0 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
244c0 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
244d0 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
244e0 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
244f0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
24500 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
24510 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
24520 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
24530 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
24540 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
24550 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
24560 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
24570 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
24580 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
24590 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
245a0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
245b0 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
245c0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
245d0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
245e0 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
245f0 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
24600 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c     */.      Cell
24610 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
24620 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
24630 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
24640 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
24650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69        assert( (i
24660 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
24670 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
24680 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
24690 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69  yload );.      i
246a0 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  f( (info.nData+(
246b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
246c0 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f  info.nKey))>info
246d0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
246e0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c     Pgno pgnoOvfl
246f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
24700 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
24710 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  w]);.        rc 
24720 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  = ptrmapPut(pPag
24730 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  e->pBt, pgnoOvfl
24740 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
24750 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  W1, pPage->pgno)
24760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
24770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
24780 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
24790 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
247a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
247b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
247c0 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
247d0 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
247e0 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
247f0 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
24800 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
24810 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
24820 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
24830 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
24840 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
24850 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24860 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
24870 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
24880 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
24890 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
248a0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
248b0 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
248c0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
248d0 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
248e0 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
248f0 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a  odies */.  u16 *
24900 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
24910 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
24920 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
24930 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24940 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
24950 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b    int totalSize;
24960 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
24970 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
24980 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
24990 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
249a0 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
249b0 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20  .  int cellptr; 
249c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
249d0 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
249e0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
249f0 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
24a00 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
24a10 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
24a20 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
24a30 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  /* Data for the 
24a40 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
24a50 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
24a60 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
24a70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
24a80 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
24a90 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
24aa0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20  ssert( nCell>=0 
24ab0 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  && nCell<=MX_CEL
24ac0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
24ad0 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
24ae0 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20  pBt)<=5460 );.  
24af0 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20  totalSize = 0;. 
24b00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
24b10 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74  l; i++){.    tot
24b20 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b  alSize += aSize[
24b30 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
24b40 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43  ( totalSize+2*nC
24b50 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ell<=pPage->nFre
24b60 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
24b70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
24b80 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
24b90 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
24ba0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
24bb0 67 65 29 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72  ge) );.  cellptr
24bc0 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
24bd0 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
24be0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
24bf0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
24c00 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74  ffset;.  put2byt
24c10 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
24c20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43  nCell);.  if( nC
24c30 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62  ell ){.    cellb
24c40 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  ody = allocateSp
24c50 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c  ace(pPage, total
24c60 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Size);.    asser
24c70 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b  t( cellbody>0 );
24c80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24c90 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e  ge->nFree >= 2*n
24ca0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  Cell );.    pPag
24cb0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43  e->nFree -= 2*nC
24cc0 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ell;.    for(i=0
24cd0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
24ce0 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
24cf0 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20  &data[cellptr], 
24d00 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20  cellbody);.     
24d10 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65   memcpy(&data[ce
24d20 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b  llbody], apCell[
24d30 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20  i], aSize[i]);. 
24d40 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20       cellptr += 
24d50 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64  2;.      cellbod
24d60 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  y += aSize[i];. 
24d70 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24d80 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65   cellbody==pPage
24d90 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
24da0 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  e );.  }.  pPage
24db0 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e  ->nCell = (u16)n
24dc0 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
24dd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
24de0 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
24df0 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
24e00 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
24e10 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
24e20 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
24e30 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
24e40 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
24e50 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
24e60 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
24e70 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
24e80 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
24e90 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
24ea0 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
24eb0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
24ec0 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
24ed0 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
24ee0 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
24ef0 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
24f00 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
24f10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
24f20 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
24f30 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
24f40 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
24f50 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
24f60 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
24f70 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
24f80 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
24f90 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
24fa0 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
24fb0 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
24fc0 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
24fd0 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
24fe0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
24ff0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
25000 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
25010 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
25020 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
25030 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
25040 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25050 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
25060 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
25070 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
25080 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
25090 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
250a0 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
250b0 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20   balance */../* 
250c0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
250d0 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
250e0 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72  balance(BtCursor
250f0 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65  *, int);..#ifnde
25100 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
25110 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
25120 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
25130 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
25140 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
25150 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
25160 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
25170 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
25180 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
25190 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
251a0 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
251b0 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
251c0 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
251d0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
251e0 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
251f0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
25200 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
25210 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ing balance the 
25220 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
25230 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
25240 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
25250 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
25260 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
25270 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
25280 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
25290 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
252a0 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
252b0 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
252c0 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
252d0 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
252e0 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
252f0 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
25300 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
25310 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
25320 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
25330 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
25340 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
25350 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
25360 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
25370 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
25380 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
25390 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
253a0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
253b0 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
253c0 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
253d0 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
253e0 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
253f0 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
25400 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
25410 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
25420 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
25430 6c 61 6e 63 65 5f 71 75 69 63 6b 28 42 74 43 75  lance_quick(BtCu
25440 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
25450 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
25460 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 50 67   *pNew = 0;.  Pg
25470 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38  no pgnoNew;.  u8
25480 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73   *pCell;.  u16 s
25490 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66  zCell;.  CellInf
254a0 6f 20 69 6e 66 6f 3b 0a 20 20 4d 65 6d 50 61 67  o info;.  MemPag
254b0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
254c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
254d0 61 67 65 5d 3b 0a 20 20 4d 65 6d 50 61 67 65 20  age];.  MemPage 
254e0 2a 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d  *pParent = pCur-
254f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25500 61 67 65 2d 31 5d 3b 0a 20 20 42 74 53 68 61 72  age-1];.  BtShar
25510 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
25520 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65  >pBt;.  int pare
25530 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d  ntIdx = pParent-
25540 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61  >nCell;   /* pPa
25550 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72  rent new divider
25560 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
25570 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b   int parentSize;
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25590 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65     /* Size of ne
255a0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
255b0 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c  /.  u8 parentCel
255c0 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20  l[64];          
255d0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
255e0 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  or the new divid
255f0 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73  er cell */..  as
25600 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25610 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
25620 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
25630 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
25640 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74  new page. Insert
25650 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
25660 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20  ll from pPage.  
25670 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e  ** into it. Then
25680 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72   remove the over
25690 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
256a0 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  Page..  */.  rc 
256b0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
256c0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
256d0 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
256e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
256f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 65 6c  E_OK ){.    pCel
25700 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  l = pPage->aOvfl
25710 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 73  [0].pCell;.    s
25720 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
25730 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
25740 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
25750 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
25760 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62  teable(pNew->pDb
25770 50 61 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72  Page) );.    zer
25780 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67  oPage(pNew, pPag
25790 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  e->aData[0]);.  
257a0 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
257b0 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
257c0 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50  &szCell);.    pP
257d0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
257e0 20 30 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 70 50   0;.  .    /* pP
257f0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
25800 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
25810 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61   of pParent. Cha
25820 6e 67 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  nge this.    ** 
25830 73 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68  so that the righ
25840 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e  t-child is the n
25850 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65  ew page allocate
25860 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 20 20  d above and.    
25870 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
25880 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68  next-to-right ch
25890 69 6c 64 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ild. .    **.   
258a0 20 2a 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72   ** Ignore the r
258b0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
258c0 68 65 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49  he call to fillI
258d0 6e 43 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43  nCell(). fillInC
258e0 65 6c 6c 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ell().    ** may
258f0 20 6f 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68   only return oth
25900 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
25910 4b 20 69 66 20 69 74 20 69 73 20 72 65 71 75 69  K if it is requi
25920 72 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  red to allocate.
25930 20 20 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f      ** one or mo
25940 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
25950 73 2e 20 53 69 6e 63 65 20 61 6e 20 69 6e 74 65  s. Since an inte
25960 72 6e 61 6c 20 74 61 62 6c 65 20 42 2d 54 72 65  rnal table B-Tre
25970 65 20 63 65 6c 6c 20 0a 20 20 20 20 2a 2a 20 6d  e cell .    ** m
25980 61 79 20 6e 65 76 65 72 20 73 70 69 6c 6c 20 6f  ay never spill o
25990 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65 72  ver onto an over
259a0 66 6c 6f 77 20 70 61 67 65 20 28 69 74 20 69 73  flow page (it is
259b0 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 20   a maximum of . 
259c0 20 20 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69     ** 13 bytes i
259d0 6e 20 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e  n size), it is n
259e0 6f 74 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f  ot neccessary to
259f0 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
25a00 6e 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  n code..    **. 
25a10 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
25a20 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
25a30 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  ) function canno
25a40 74 20 66 61 69 6c 20 69 66 20 74 68 65 20 70 61  t fail if the pa
25a50 67 65 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  ge.    ** being 
25a60 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73  inserted into is
25a70 20 61 6c 72 65 61 64 79 20 77 72 69 74 61 62 6c   already writabl
25a80 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 64  e and the cell d
25a90 6f 65 73 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20  oes not .    ** 
25aa0 63 6f 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66  contain an overf
25ab0 6c 6f 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20  low pointer. So 
25ac0 69 67 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75  ignore this retu
25ad0 72 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 20  rn code too..   
25ae0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
25af0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
25b00 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ;.    pCell = fi
25b10 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
25b20 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
25b30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
25b40 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
25b50 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
25b60 3b 0a 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c  ;.    fillInCell
25b70 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
25b80 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
25b90 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61  ey, 0, 0, 0, &pa
25ba0 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 61  rentSize);.    a
25bb0 73 73 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a  ssert( parentSiz
25bc0 65 3c 36 34 20 29 3b 0a 20 20 20 20 61 73 73 65  e<64 );.    asse
25bd0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
25be0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
25bf0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
25c00 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
25c10 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49  pParent, parentI
25c20 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20  dx, parentCell, 
25c30 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34  parentSize, 0, 4
25c40 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
25c50 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
25c60 28 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49  (pParent,parentI
25c70 64 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  dx), pPage->pgno
25c80 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
25c90 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
25ca0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
25cb0 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
25cc0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
25cd0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
25ce0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
25cf0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
25d00 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74  r map.    ** wit
25d10 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
25d20 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
25d30 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
25d40 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c   the .    ** cel
25d50 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  l on the page to
25d60 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25d70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
25d80 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
25d90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
25da0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
25db0 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
25dc0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
25dd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
25de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25df0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
25e00 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30  pPutOvfl(pNew, 0
25e10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
25e20 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
25e30 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
25e40 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
25e50 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  */.    releasePa
25e60 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  ge(pNew);.  }.. 
25e70 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
25e80 74 20 74 68 65 20 70 50 61 67 65 2d 3e 6e 46 72  t the pPage->nFr
25e90 65 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e  ee variable is n
25ea0 6f 74 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  ot set correctly
25eb0 20 77 69 74 68 0a 20 20 2a 2a 20 72 65 73 70 65   with.  ** respe
25ec0 63 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ct to the conten
25ed0 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 28 62  t of the page (b
25ee0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 73 65  ecause it was se
25ef0 74 20 74 6f 20 30 20 62 79 20 0a 20 20 2a 2a 20  t to 0 by .  ** 
25f00 69 6e 73 65 72 74 43 65 6c 6c 29 2e 20 53 6f 20  insertCell). So 
25f10 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65  call sqlite3Btre
25f20 65 49 6e 69 74 50 61 67 65 28 29 20 74 6f 20 6d  eInitPage() to m
25f30 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 0a 20  ake sure it is. 
25f40 20 2a 2a 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   ** correct..  *
25f50 2a 0a 20 20 2a 2a 20 54 68 69 73 20 68 61 73 20  *.  ** This has 
25f60 74 6f 20 62 65 20 64 6f 6e 65 20 65 76 65 6e 20  to be done even 
25f70 69 66 20 61 6e 20 65 72 72 6f 72 20 77 69 6c 6c  if an error will
25f80 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 4e 6f   be returned. No
25f90 72 6d 61 6c 6c 79 2c 20 69 66 0a 20 20 2a 2a 20  rmally, if.  ** 
25fa0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
25fb0 64 75 72 69 6e 67 20 74 72 65 65 20 62 61 6c 61  during tree bala
25fc0 6e 63 69 6e 67 2c 20 74 68 65 20 63 6f 6e 74 65  ncing, the conte
25fd0 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61  nts of MemPage a
25fe0 72 65 0a 20 20 2a 2a 20 6e 6f 74 20 69 6d 70 6f  re.  ** not impo
25ff0 72 74 61 6e 74 2c 20 61 73 20 74 68 65 79 20 77  rtant, as they w
26000 69 6c 6c 20 62 65 20 72 65 63 61 6c 63 75 6c 61  ill be recalcula
26010 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 61 67  ted when the pag
26020 65 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  e is rolled.  **
26030 20 62 61 63 6b 2e 20 42 75 74 20 68 65 72 65 2c   back. But here,
26040 20 69 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63   in balance_quic
26050 6b 28 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69  k(), it is possi
26060 62 6c 65 20 74 68 61 74 20 70 50 61 67 65 20 68  ble that pPage h
26070 61 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 79 65 74  as .  ** not yet
26080 20 62 65 65 6e 20 6d 61 72 6b 65 64 20 64 69 72   been marked dir
26090 74 79 20 6f 72 20 77 72 69 74 74 65 6e 20 69 6e  ty or written in
260a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
260b0 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 0a 20  ile. Therefore. 
260c0 20 2a 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   ** it will not 
260d0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
260e0 6e 64 20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f  nd so it is impo
260f0 72 74 61 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75  rtant to make su
26100 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
26110 20 70 61 67 65 20 64 61 74 61 20 61 6e 64 20 63   page data and c
26120 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61  ontents of MemPa
26130 67 65 20 61 72 65 20 63 6f 6e 73 69 73 74 65 6e  ge are consisten
26140 74 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 2d  t..  */.  pPage-
26150 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73  >isInit = 0;.  s
26160 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
26170 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 61 73  age(pPage);.  as
26180 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
26190 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
261a0 2f 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  /* If everything
261b0 20 65 6c 73 65 20 73 75 63 63 65 65 64 65 64 2c   else succeeded,
261c0 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
261d0 65 6e 74 20 70 61 67 65 2c 20 69 6e 20 0a 20 20  ent page, in .  
261e0 2a 2a 20 63 61 73 65 20 74 68 65 20 64 69 76 69  ** case the divi
261f0 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65  der cell inserte
26200 64 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62  d caused it to b
26210 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a  ecome overfull..
26220 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
26230 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26240 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
26250 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50  e);.    pCur->iP
26260 61 67 65 2d 2d 3b 0a 20 20 20 20 72 63 20 3d 20  age--;.    rc = 
26270 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29  balance(pCur, 0)
26280 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26290 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
262a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
262b0 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  BALANCE */../*.*
262c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
262d0 65 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c  edistributes Cel
262e0 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20  ls on pPage and 
262f0 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69  up to NN*2 sibli
26300 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20  ngs.** of pPage 
26310 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
26320 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
26330 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20   same amount of 
26340 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55  free space..** U
26350 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e  sually NN siblin
26360 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  gs on either sid
26370 65 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73  e of pPage is us
26380 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
26390 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d  ing,.** though m
263a0 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67  ore siblings mig
263b0 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65  ht come from one
263c0 20 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69   side if pPage i
263d0 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f  s the first.** o
263e0 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20  r last child of 
263f0 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20  its parent.  If 
26400 70 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20  pPage has fewer 
26410 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e  than 2*NN siblin
26420 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67  gs.** (something
26430 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20   which can only 
26440 68 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20  happen if pPage 
26450 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
26460 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20   or a .** child 
26470 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c  of root) then al
26480 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c  l available sibl
26490 69 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65  ings participate
264a0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
264b0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  g..**.** The num
264c0 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ber of siblings 
264d0 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62  of pPage might b
264e0 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64  e increased or d
264f0 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20  ecreased by one 
26500 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20  or.** two in an 
26510 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
26520 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
26530 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
26540 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67  ll. The root pag
26550 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20  e.** is special 
26560 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  and is allowed t
26570 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  o be nearly empt
26580 79 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a  y. If pPage is .
26590 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
265a0 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68  , then the depth
265b0 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67   of the tree mig
265c0 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a  ht be increased.
265d0 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ** or decreased 
265e0 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73  by one, as neces
265f0 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68  sary, to keep th
26600 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d  e root page from
26610 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75   being.** overfu
26620 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79  ll or completely
26630 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   empty..**.** No
26640 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
26650 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
26660 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
26670 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a   Cells on pPage.
26680 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
26690 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
266a0 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
266b0 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  ].  This can hap
266c0 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
266d0 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
266e0 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62   Part of the job
266f0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
26700 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73   is to.** make s
26710 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f  ure all Cells fo
26720 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61  r pPage once aga
26730 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d  in fit in pPage-
26740 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  >aData[]..**.** 
26750 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66  In the course of
26760 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73   balancing the s
26770 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65  iblings of pPage
26780 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  , the parent of 
26790 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62  pPage.** might b
267a0 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
267b0 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66  r underfull.  If
267c0 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74   that happens, t
267d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
267e0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65  .** is called re
267f0 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65  cursively on the
26800 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   parent..**.** I
26810 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
26820 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
26830 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65  son, it might le
26840 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ave the database
26850 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74  .** in a corrupt
26860 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66  ed state.  So if
26870 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
26880 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
26890 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
268a0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73  olled back..*/.s
268b0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
268c0 65 5f 6e 6f 6e 72 6f 6f 74 28 42 74 43 75 72 73  e_nonroot(BtCurs
268d0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
268e0 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
268f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26900 20 6f 76 65 72 20 6f 72 20 75 6e 64 65 72 66 75   over or underfu
26910 6c 6c 20 70 61 67 65 20 74 6f 20 62 61 6c 61 6e  ll page to balan
26920 63 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ce */.  MemPage 
26930 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
26940 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
26950 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  nt of pPage */. 
26960 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26980 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
26990 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
269a0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
269b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
269c0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
269d0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
269e0 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
269f0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
26a00 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
26a10 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
26a20 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  m. */.  int nOld
26a30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
26a40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26a50 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
26a60 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  [] */.  int nNew
26a70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
26a80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26a90 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
26aa0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76  [] */.  int nDiv
26ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26ac0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26ad0 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76  f cells in apDiv
26ae0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
26af0 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
26b00 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
26b10 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
26b20 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
26b30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
26b40 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61   of pPage in pPa
26b50 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
26b60 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b80 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
26b90 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
26ba0 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
26bb0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
26bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26bd0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
26be0 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65  .  int leafCorre
26bf0 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
26c00 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
26c10 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
26c20 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
26c30 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
26c40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
26c50 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
26c60 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
26c70 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
26c80 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
26c90 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
26ca0 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
26cb0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
26cc0 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
26cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
26ce0 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
26cf0 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
26d00 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
26d10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
26d20 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
26d30 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
26d40 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
26d50 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
26d60 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
26d70 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
26d80 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
26d90 69 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20  iSpace2 = 0;    
26da0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
26db0 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
26dc0 20 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20   aSpace2[] */.  
26dd0 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20  int szScratch;  
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26df0 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20  Size of scratch 
26e00 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64  memory requested
26e10 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
26e20 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pOld[NB];       
26e30 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
26e40 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e  up to two siblin
26e50 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  gs */.  Pgno pgn
26e60 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  oOld[NB];       
26e70 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
26e80 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
26e90 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  ge in apOld[] */
26ea0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
26eb0 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
26ec0 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
26ed0 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
26ee0 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
26ef0 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
26f00 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
26f10 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
26f20 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
26f30 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ing */.  Pgno pg
26f40 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  noNew[NB+2];    
26f50 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
26f60 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
26f70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  age in apNew[] *
26f80 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42  /.  u8 *apDiv[NB
26f90 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
26fa0 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c   /* Divider cell
26fb0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  s in pParent */.
26fc0 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b    int cntNew[NB+
26fd0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
26fe0 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c  * Index in aCell
26ff0 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72  [] of cell after
27000 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
27010 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b  int szNew[NB+2];
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27030 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66  Combined size of
27040 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20   cells place on 
27050 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  i-th page */.  u
27060 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20  8 **apCell = 0; 
27070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
27080 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
27090 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
270a0 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
270b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
270c0 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
270d0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
270e0 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b   */.  u8 *aCopy[
270f0 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
27100 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e  Space for holdin
27110 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79  g data of apCopy
27120 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  [] */.  u8 *aSpa
27130 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ce1;           /
27140 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69  * Space for copi
27150 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63  es of dividers c
27160 65 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61  ells before bala
27170 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  nce */.  u8 *aSp
27180 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ace2 = 0;       
27190 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65  /* Space for ove
271a0 72 66 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63  rflow dividers c
271b0 65 6c 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ells after balan
271c0 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f  ce */.  u8 *aFro
271d0 6d 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  m = 0;..  pPage 
271e0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
271f0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
27200 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
27210 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
27220 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
27230 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72    VVA_ONLY( pCur
27240 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
27250 3d 20 31 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  = 1 );..  /* .  
27260 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65  ** Find the pare
27270 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  nt page..  */.  
27280 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
27290 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
272a0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
272b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
272c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
272d0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
272e0 50 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e  Page) || pPage->
272f0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
27300 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
27310 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20  Bt;.  pParent = 
27320 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27330 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61  r->iPage-1];.  a
27340 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 29  ssert( pParent )
27350 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
27360 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
27370 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65  PagerWrite(pPare
27380 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  nt->pDbPage)) ){
27390 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
273a0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  e_cleanup;.  }..
273b0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
273c0 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
273d0 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
273e0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
273f0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  arent->pgno));..
27400 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27410 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
27420 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65  .  /*.  ** A spe
27430 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61  cial case:  If a
27440 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a   new entry has j
27450 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ust been inserte
27460 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61  d into a.  ** ta
27470 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20  ble (that is, a 
27480 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67  btree with integ
27490 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20  er keys and all 
274a0 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76  data at the leav
274b0 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  es).  ** and the
274c0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68   new entry is th
274d0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
274e0 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28  ry in the tree (
274f0 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20  it has the.  ** 
27500 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65  largest key) the
27510 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61  n use the specia
27520 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
27530 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20  ) routine for.  
27540 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62  ** balancing.  b
27550 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
27560 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e  s much faster an
27570 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  d results in a t
27580 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b  ighter.  ** pack
27590 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74  ing of data in t
275a0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
275b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
275c0 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20  ->leaf &&.      
275d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
275e0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
275f0 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20  verflow==1 &&.  
27600 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
27610 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
27620 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70  nCell &&.      p
27630 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20  Parent->pgno!=1 
27640 26 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74  &&.      get4byt
27650 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
27660 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
27670 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d  fset+8])==pPage-
27680 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61  >pgno.  ){.    a
27690 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
276a0 74 4b 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20  tKey );.    /*. 
276b0 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63     ** TODO: Chec
276c0 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74  k the siblings t
276d0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50  o the left of pP
276e0 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74  age. It may be t
276f0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20  hat.    ** they 
27700 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64  are not full and
27710 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20   no new page is 
27720 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
27730 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61  .    return bala
27740 6e 63 65 5f 71 75 69 63 6b 28 70 43 75 72 29 3b  nce_quick(pCur);
27750 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
27760 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
27770 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27780 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
27790 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 67 6f  Page)) ){.    go
277a0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
277b0 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  up;.  }..  /*.  
277c0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c  ** Find the cell
277d0 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
277e0 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63  age whose left c
277f0 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b  hild points back
27800 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20  .  ** to pPage. 
27810 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61   The "idx" varia
27820 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78  ble is the index
27830 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20   of that cell.  
27840 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73  If pPage.  ** is
27850 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63   the rightmost c
27860 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20  hild of pParent 
27870 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20  then set idx to 
27880 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a  pParent->nCell .
27890 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75    */.  idx = pCu
278a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
278b0 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72  Page-1];.  asser
278c0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 70 50 61  tParentIndex(pPa
278d0 72 65 6e 74 2c 20 69 64 78 2c 20 70 50 61 67 65  rent, idx, pPage
278e0 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20  ->pgno);..  /*. 
278f0 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67   ** Find sibling
27900 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20   pages to pPage 
27910 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  and the cells in
27920 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69   pParent that di
27930 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69  vide.  ** the si
27940 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65  blings.  An atte
27950 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
27960 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
27970 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73  on either.  ** s
27980 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d  ide of pPage.  M
27990 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
279a0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
279b0 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69  side, however, i
279c0 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65  f.  ** pPage the
279d0 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61  re are fewer tha
279e0 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  n NN siblings on
279f0 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e   the other side.
27a00 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a    If pParent.  *
27a10 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
27a20 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
27a30 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
27a40 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
27a50 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20  n..  */.  nxDiv 
27a60 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66  = idx - NN;.  if
27a70 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70  ( nxDiv + NB > p
27a80 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
27a90 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61  .    nxDiv = pPa
27aa0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42  rent->nCell - NB
27ab0 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   + 1;.  }.  if( 
27ac0 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e  nxDiv<0 ){.    n
27ad0 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDiv = 0;.  }.  
27ae0 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nDiv = 0;.  for(
27af0 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c  i=0, k=nxDiv; i<
27b00 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20  NB; i++, k++){. 
27b10 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74     if( k<pParent
27b20 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
27b30 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
27b40 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29  Cell(pParent, k)
27b50 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a  ;.      nDiv++;.
27b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
27b70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a  Parent->leaf );.
27b80 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
27b90 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
27ba0 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[i]);.    }else
27bb0 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d   if( k==pParent-
27bc0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
27bd0 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
27be0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
27bf0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
27c00 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
27c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
27c20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27c30 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
27c40 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64  age(pBt, pgnoOld
27c50 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b  [i], &apOld[i]);
27c60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
27c70 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
27c80 75 70 3b 0a 20 20 20 20 2f 2a 20 61 70 4f 6c 64  up;.    /* apOld
27c90 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  [i]->idxParent =
27ca0 20 6b 3b 20 2a 2f 0a 20 20 20 20 61 70 43 6f 70   k; */.    apCop
27cb0 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73  y[i] = 0;.    as
27cc0 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b  sert( i==nOld );
27cd0 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20  .    nOld++;.   
27ce0 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
27cf0 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
27d00 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
27d10 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  low;.  }..  /* M
27d20 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20  ake nMaxCells a 
27d30 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e  multiple of 4 in
27d40 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72   order to preser
27d50 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61  ve 8-byte.  ** a
27d60 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d  lignment */.  nM
27d70 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43  axCells = (nMaxC
27d80 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20  ells + 3)&~3;.. 
27d90 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
27da0 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
27db0 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20  ry structures.  
27dc0 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d  */.  szScratch =
27dd0 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
27de0 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e00 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
27e10 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
27e20 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e40 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
27e50 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28  .     + (ROUND8(
27e60 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
27e70 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a  +pBt->pageSize)*
27e80 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a  NB  /* aCopy */.
27e90 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65       + pBt->page
27ea0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ec0 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f     /* aSpace1 */
27ed0 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56  .     + (ISAUTOV
27ee0 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c  ACUUM ? nMaxCell
27ef0 73 20 3a 20 30 29 3b 20 20 20 20 20 20 20 20 20  s : 0);         
27f00 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a      /* aFrom */.
27f10 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
27f20 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
27f30 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20   szScratch ); . 
27f40 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
27f50 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
27f60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
27f70 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
27f80 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
27f90 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
27fa0 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43  nMaxCells];.  aC
27fb0 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73  opy[0] = (u8*)&s
27fc0 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
27fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43  ;.  assert( ((aC
27fe0 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 30 29  opy[0] - (u8*)0)
27ff0 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
28000 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
28010 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f  required */.  fo
28020 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b  r(i=1; i<NB; i++
28030 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20  ){.    aCopy[i] 
28040 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42  = &aCopy[i-1][pB
28050 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
28060 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
28070 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  e))];.    assert
28080 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28  ( ((aCopy[i] - (
28090 75 38 2a 29 30 29 20 26 20 37 29 3d 3d 30 20 29  u8*)0) & 7)==0 )
280a0 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
280b0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
280c0 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 31 20  /.  }.  aSpace1 
280d0 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70  = &aCopy[NB-1][p
280e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
280f0 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
28100 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge))];.  assert(
28110 20 28 28 61 53 70 61 63 65 31 20 2d 20 28 75 38   ((aSpace1 - (u8
28120 2a 29 30 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  *)0) & 7)==0 ); 
28130 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
28140 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
28150 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
28160 55 4d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20  UM ){.    aFrom 
28170 3d 20 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  = &aSpace1[pBt->
28180 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20  pageSize];.  }. 
28190 20 61 53 70 61 63 65 32 20 3d 20 73 71 6c 69 74   aSpace2 = sqlit
281a0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74  e3PageMalloc(pBt
281b0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  ->pageSize);.  i
281c0 66 28 20 61 53 70 61 63 65 32 3d 3d 30 20 29 7b  f( aSpace2==0 ){
281d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
281e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
281f0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
28200 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20  ;.  }.  .  /*.  
28210 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  ** Make copies o
28220 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  f the content of
28230 20 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73   pPage and its s
28240 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c  iblings into aOl
28250 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65  d[]..  ** The re
28260 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
28270 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
28280 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
28290 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68  s rather.  ** th
282a0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
282b0 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
282c0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
282d0 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
282e0 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
282f0 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
28300 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
28310 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
28320 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20     MemPage *p = 
28330 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
28340 50 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a  Page*)aCopy[i];.
28350 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 61 70      memcpy(p, ap
28360 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
28370 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 2d  emPage));.    p-
28380 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
28390 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  &p[1];.    memcp
283a0 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c  y(p->aData, apOl
283b0 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74  d[i]->aData, pBt
283c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
283d0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
283e0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
283f0 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
28400 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
28410 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
28420 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
28430 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
28440 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
28450 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
28460 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
28470 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72  ace obtained for
28480 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
28490 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
284a0 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
284b0 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
284c0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
284d0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
284e0 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
284f0 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
28500 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
28510 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
28520 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
28530 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
28540 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
28550 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
28560 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
28570 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
28580 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
28590 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
285a0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
285b0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
285c0 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
285d0 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
285e0 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
285f0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
28600 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
28610 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
28620 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
28630 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
28640 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
28650 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
28660 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
28670 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
28680 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
28690 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
286a0 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
286b0 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
286c0 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
286d0 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
286e0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
286f0 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
28700 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
28710 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  ge->hasData;.  f
28720 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
28730 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
28740 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
28750 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
28760 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
28770 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
28780 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
28790 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
287a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
287b0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
287c0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
287d0 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
287e0 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
287f0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
28800 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
28810 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
28820 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66  Cell]);.      if
28830 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
28840 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b  {.        int a;
28850 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e  .        aFrom[n
28860 43 65 6c 6c 5d 20 3d 20 28 75 38 29 69 3b 20 20  Cell] = (u8)i;  
28870 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
28880 20 69 3c 36 20 29 3b 0a 20 20 20 20 20 20 20 20   i<6 );.        
28890 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d  for(a=0; a<pOld-
288a0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29  >nOverflow; a++)
288b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
288c0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70  pOld->aOvfl[a].p
288d0 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65  Cell==apCell[nCe
288e0 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ll] ){.         
288f0 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
28900 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  = 0xFF;.        
28910 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
28930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
28940 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
28950 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29    if( i<nOld-1 )
28960 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d  {.      u16 sz =
28970 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
28980 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
28990 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
289a0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
289b0 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44  * With the LEAFD
289c0 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e  ATA flag, pParen
289d0 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c  t cells hold onl
289e0 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20  y INTKEYs that. 
289f0 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75         ** are du
28a00 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73  plicates of keys
28a10 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61   on the child pa
28a20 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ges.  We need to
28a30 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20   remove.        
28a40 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ** the divider c
28a50 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e  ells from pParen
28a60 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64  t, but the divid
28a70 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f  ers cells are no
28a80 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  t.        ** add
28a90 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62  ed to apCell[] b
28aa0 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
28ab0 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68  duplicates of ch
28ac0 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20  ild cells..     
28ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72     */.        dr
28ae0 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
28af0 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
28b00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28b10 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
28b20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
28b30 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
28b40 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
28b50 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
28b60 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
28b70 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20  ce1[iSpace1];.  
28b80 20 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d        iSpace1 +=
28b90 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73   sz;.        ass
28ba0 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
28bb0 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
28bc0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
28bd0 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ce1<=pBt->pageSi
28be0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ze );.        me
28bf0 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69  mcpy(pTemp, apDi
28c00 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20  v[i], sz);.     
28c10 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
28c20 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72   = pTemp+leafCor
28c30 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
28c40 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
28c50 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  M ){.          a
28c60 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
28c70 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  FF;.        }.  
28c80 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
28c90 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
28ca0 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  z);.        asse
28cb0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
28cc0 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72  on==0 || leafCor
28cd0 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
28ce0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
28cf0 6c 6c 5d 20 2d 3d 20 28 75 31 36 29 6c 65 61 66  ll] -= (u16)leaf
28d00 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
28d10 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
28d20 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e  byte(pTemp)==pgn
28d30 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20  oOld[i] );.     
28d40 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65     if( !pOld->le
28d50 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
28d60 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
28d70 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20  ection==0 );.   
28d80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
28d90 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
28da0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
28db0 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
28dc0 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  eft.          **
28dd0 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
28de0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
28df0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
28e00 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (apCell[nCell], 
28e10 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c  &pOld->aData[pOl
28e20 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  d->hdrOffset+8],
28e30 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
28e40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
28e50 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
28e60 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
28e70 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
28e80 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
28e90 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
28ea0 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
28eb0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
28ec0 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
28ed0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
28ee0 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
28ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
28f00 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b          nCell++;
28f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28f20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
28f30 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
28f40 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
28f50 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
28f60 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
28f70 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
28f80 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
28f90 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
28fa0 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
28fb0 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
28fc0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
28fd0 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
28fe0 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
28ff0 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
29000 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
29010 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
29020 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
29030 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
29040 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
29050 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
29060 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
29070 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
29080 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
29090 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
290a0 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
290b0 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
290c0 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
290d0 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
290e0 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
290f0 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
29100 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
29110 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
29120 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
29130 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
29140 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
29150 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
29160 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
29170 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
29180 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
29190 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
291a0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
291b0 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
291c0 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
291d0 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
291e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
291f0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
29200 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
29210 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
29220 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
29230 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
29240 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
29250 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
29260 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
29270 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
29280 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
29290 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
292a0 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
292b0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
292c0 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
292d0 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
292e0 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
292f0 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a       k++;.    }.
29300 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
29310 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
29320 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
29330 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
29340 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
29350 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
29360 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
29370 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
29380 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
29390 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
293a0 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
293b0 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
293c0 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
293d0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
293e0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
293f0 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
29400 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
29410 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
29420 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
29430 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
29440 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
29450 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
29460 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
29470 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
29480 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
29490 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
294a0 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
294b0 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
294c0 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
294d0 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
294e0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
294f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
29500 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
29510 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
29520 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
29530 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
29540 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
29550 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
29560 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
29570 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
29580 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
29590 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
295a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
295b0 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
295c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
295d0 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
295e0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
295f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29600 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
29610 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
29620 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
29630 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
29640 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
29650 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
29660 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
29670 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
29680 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
29690 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
296a0 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
296b0 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
296c0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
296d0 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
296e0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
296f0 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
29700 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
29710 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
29720 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
29730 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
29740 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
29750 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
29760 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
29770 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
29780 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
29790 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
297a0 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
297b0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
297c0 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
297d0 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
297e0 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
297f0 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
29800 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
29810 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
29820 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20  ])>0) or we are 
29830 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75  the.  ** a virtu
29840 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
29850 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
29860 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
29870 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
29880 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
29890 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
298a0 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
298b0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
298c0 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
298d0 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
298e0 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
298f0 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
29900 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
29910 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
29920 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
29930 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
29940 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
29950 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
29960 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50    pageFlags = pP
29970 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  age->aData[0];. 
29980 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
29990 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
299a0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
299b0 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
299c0 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
299d0 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
299e0 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
299f0 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20  gnoOld[i];.     
29a00 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
29a10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29a20 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
29a30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
29a40 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
29a50 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
29a60 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
29a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29a80 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
29a90 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
29aa0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
29ab0 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
29ac0 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31  [i], pgnoNew[i-1
29ad0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
29ae0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
29af0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
29b00 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
29b10 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
29b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29b30 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
29b40 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
29b50 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
29b60 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
29b70 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
29b80 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
29b90 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
29ba0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
29bb0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
29bc0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
29bd0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
29be0 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
29bf0 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
29c00 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
29c10 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
29c20 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
29c30 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
29c40 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
29c50 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
29c60 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
29c70 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
29c80 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
29c90 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
29ca0 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
29cb0 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
29cc0 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
29cd0 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
29ce0 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
29cf0 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
29d00 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
29d10 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
29d20 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
29d30 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
29d40 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
29d50 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
29d60 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
29d70 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
29d80 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
29d90 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
29da0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
29db0 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
29dc0 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
29dd0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
29de0 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
29df0 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
29e00 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
29e10 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
29e20 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
29e30 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
29e40 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
29e50 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
29e60 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
29e70 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
29e80 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28  if( pgnoNew[j]<(
29e90 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b  unsigned)minV ){
29ea0 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20  .        minI = 
29eb0 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20  j;.        minV 
29ec0 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20  = pgnoNew[j];.  
29ed0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
29ee0 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
29ef0 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
29f00 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
29f10 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b      t = pgnoNew[
29f20 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  i];.      pT = a
29f30 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pNew[i];.      p
29f40 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
29f50 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
29f60 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
29f70 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70  w[minI];.      p
29f80 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74  gnoNew[minI] = t
29f90 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
29fa0 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
29fb0 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
29fc0 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
29fd0 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64  d %d  new: %d(%d
29fe0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
29ff0 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
2a000 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d  ,.    pgnoOld[0]
2a010 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
2a020 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c   pgnoOld[1] : 0,
2a030 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70  .    nOld>=3 ? p
2a040 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20  gnoOld[2] : 0,. 
2a050 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73     pgnoNew[0], s
2a060 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
2a070 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31  w>=2 ? pgnoNew[1
2a080 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  ] : 0, nNew>=2 ?
2a090 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
2a0a0 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e     nNew>=3 ? pgn
2a0b0 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[2] : 0, nNe
2a0c0 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
2a0d0 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
2a0e0 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20   ? pgnoNew[3] : 
2a0f0 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
2a100 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
2a110 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77  New>=5 ? pgnoNew
2a120 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  [4] : 0, nNew>=5
2a130 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
2a140 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
2a150 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
2a160 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
2a170 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
2a180 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
2a190 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
2a1a0 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
2a1b0 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
2a1c0 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
2a1d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
2a1e0 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
2a1f0 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
2a200 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
2a210 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
2a220 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
2a230 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
2a240 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
2a250 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d  ert( pNew->pgno=
2a260 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20  =pgnoNew[i] );. 
2a270 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
2a280 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20  , pageFlags);.  
2a290 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
2a2a0 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a  New, cntNew[i]-j
2a2b0 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73  , &apCell[j], &s
2a2c0 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61  zCell[j]);.    a
2a2d0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65  ssert( pNew->nCe
2a2e0 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31  ll>0 || (nNew==1
2a2f0 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30   && cntNew[0]==0
2a300 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2a310 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pNew->nOverflow
2a320 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ==0 );..    /* I
2a330 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
2a340 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
2a350 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
2a360 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
2a370 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f  s.    ** that po
2a380 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69  int to the sibli
2a390 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65  ngs that were re
2a3a0 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20  arranged. These 
2a3b0 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20  can be: left.   
2a3c0 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20   ** children of 
2a3d0 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74  cells, the right
2a3e0 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
2a3f0 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ge, or overflow 
2a400 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69  pages.    ** poi
2a410 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73  nted to by cells
2a420 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2a430 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2a440 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20  .      for(k=j; 
2a450 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b  k<cntNew[i]; k++
2a460 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2a470 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( k<nMaxCells )
2a480 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46  ;.        if( aF
2a490 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20  rom[k]==0xFF || 
2a4a0 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d  apCopy[aFrom[k]]
2a4b0 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
2a4c0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  no ){.          
2a4d0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
2a4e0 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20  fl(pNew, k-j);. 
2a4f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2a500 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65  =SQLITE_OK && le
2a510 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
2a520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2a530 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2a540 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65  t, get4byte(apCe
2a550 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41 50 5f 42  ll[k]), PTRMAP_B
2a560 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  TREE, pNew->pgno
2a570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2a580 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2a590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a5a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
2a5b0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2a5c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a5d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2a5e0 20 20 7d 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74    }..    j = cnt
2a5f0 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
2a600 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
2a610 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
2a620 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
2a630 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
2a640 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
2a650 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
2a660 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
2a670 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2a680 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26    if( i<nNew-1 &
2a690 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  & j<nCell ){.   
2a6a0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
2a6b0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
2a6c0 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
2a6d0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
2a6e0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
2a6f0 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
2a700 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
2a710 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
2a720 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
2a730 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
2a740 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20 20 20  2[iSpace2];.    
2a750 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
2a760 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
2a770 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
2a780 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
2a790 20 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55          if( ISAU
2a7a0 54 4f 56 41 43 55 55 4d 20 0a 20 20 20 20 20 20  TOVACUUM .      
2a7b0 20 20 20 26 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d     && (aFrom[j]=
2a7c0 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b  =0xFF || apCopy[
2a7d0 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21  aFrom[j]]->pgno!
2a7e0 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a 20 20 20  =pNew->pgno).   
2a7f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2a800 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2a810 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
2a820 43 65 6c 6c 29 2c 20 50 54 52 4d 41 50 5f 42 54  Cell), PTRMAP_BT
2a830 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  REE, pNew->pgno)
2a840 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a860 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2a870 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2a880 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
2a890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a8a0 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
2a8b0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
2a8c0 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
2a8d0 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
2a8e0 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
2a8f0 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
2a900 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
2a910 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
2a920 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
2a930 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
2a940 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
2a950 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
2a960 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
2a970 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
2a980 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
2a990 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
2a9a0 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
2a9b0 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
2a9c0 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
2a9d0 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
2a9e0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
2a9f0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  --;.        sqli
2aa00 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
2aa10 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
2aa20 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
2aa30 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
2aa40 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 66 69 6c  emp;.        fil
2aa50 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
2aa60 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e   pCell, 0, info.
2aa70 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26  nKey, 0, 0, 0, &
2aa80 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  sz);.        pTe
2aa90 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
2aaa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
2aab0 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
2aac0 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
2aad0 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
2aae0 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
2aaf0 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
2ab00 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
2ab10 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
2ab20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
2ab30 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
2ab40 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
2ab50 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
2ab60 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
2ab70 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
2ab80 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
2ab90 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33   ** (see sqlite3
2aba0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
2abb0 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
2abc0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
2abd0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
2abe0 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
2abf0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
2ac00 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
2ac10 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
2ac20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
2ac30 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
2ac40 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
2ac50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2ac60 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
2ac70 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
2ac80 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
2ac90 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
2aca0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
2acb0 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
2acc0 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
2acd0 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
2ace0 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
2acf0 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
2ad00 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
2ad10 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
2ad20 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
2ad30 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
2ad40 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
2ad50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
2ad60 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
2ad70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
2ad80 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2ad90 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
2ada0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2adb0 0a 20 20 20 20 20 20 69 53 70 61 63 65 32 20 2b  .      iSpace2 +
2adc0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
2add0 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
2ade0 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
2adf0 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 32   assert( iSpace2
2ae00 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
2ae10 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  );.      rc = in
2ae20 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
2ae30 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
2ae40 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20  sz, pTemp, 4);. 
2ae50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ae60 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61  ITE_OK ) goto ba
2ae70 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2ae80 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2ae90 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2aea0 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
2aeb0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
2aec0 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
2aed0 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
2aee0 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e  t,nxDiv), pNew->
2aef0 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  pgno);..      /*
2af00 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2af10 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2af20 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c  ase, and not a l
2af30 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20  eaf-data tree,. 
2af40 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64       ** then upd
2af50 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
2af60 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72  map with an entr
2af70 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
2af80 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
2af90 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a   that the cell j
2afa0 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69  ust inserted poi
2afb0 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e  nts to (if any).
2afc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2afd0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2afe0 20 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b   && !leafData ){
2aff0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
2b000 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72  rmapPutOvfl(pPar
2b010 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20  ent, nxDiv);.   
2b020 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2b030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b040 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2b050 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2b060 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2b070 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44    j++;.      nxD
2b080 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iv++;.    }..   
2b090 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e   /* Set the poin
2b0a0 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
2b0b0 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  r the new siblin
2b0c0 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 69  g page. */.    i
2b0d0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2b0e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
2b0f0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65  rmapPut(pBt, pNe
2b100 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  w->pgno, PTRMAP_
2b110 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
2b120 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2b130 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b140 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62  {.        goto b
2b150 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2b160 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b170 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
2b180 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
2b190 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73  ( nOld>0 );.  as
2b1a0 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
2b1b0 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73    if( (pageFlags
2b1c0 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20   & PTF_LEAF)==0 
2b1d0 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c  ){.    u8 *zChil
2b1e0 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64  d = &apCopy[nOld
2b1f0 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20  -1]->aData[8];. 
2b200 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77     memcpy(&apNew
2b210 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nNew-1]->aData[
2b220 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a  8], zChild, 4);.
2b230 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2b240 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
2b250 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2b260 2c 20 67 65 74 34 62 79 74 65 28 7a 43 68 69 6c  , get4byte(zChil
2b270 64 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  d), PTRMAP_BTREE
2b280 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  , apNew[nNew-1]-
2b290 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
2b2a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b2b0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
2b2c0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2b2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b2e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
2b2f0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2b300 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
2b310 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
2b320 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
2b330 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e  nCell+pParent->n
2b340 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2b350 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69  /* Right-most si
2b360 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67  bling is the rig
2b370 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ht-most child of
2b380 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20   pParent */.    
2b390 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
2b3a0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2b3b0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2b3c0 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29  pgnoNew[nNew-1])
2b3d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2b3e0 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
2b3f0 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74  ling is the left
2b400 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69   child of the fi
2b410 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61  rst entry in pPa
2b420 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74  rent.    ** past
2b430 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2b440 64 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f  divider entry */
2b450 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69  .    put4byte(fi
2b460 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2b470 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20  Parent, nxDiv), 
2b480 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29  pgnoNew[nNew-1])
2b490 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
2b4a0 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   Balance the par
2b4b0 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20  ent page.  Note 
2b4c0 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  that the current
2b4d0 20 70 61 67 65 20 28 70 50 61 67 65 29 20 6d 69   page (pPage) mi
2b4e0 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ght.  ** have be
2b4f0 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  en added to the 
2b500 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d  freelist so it m
2b510 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62  ight no longer b
2b520 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
2b530 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72 65   ** But the pare
2b540 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77  nt page will alw
2b550 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ays be initializ
2b560 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
2b570 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e  t( pParent->isIn
2b580 69 74 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  it );.  sqlite3S
2b590 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c  cratchFree(apCel
2b5a0 6c 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30  l);.  apCell = 0
2b5b0 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
2b5c0 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69  NCE: finished wi
2b5d0 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65  th %d: old=%d ne
2b5e0 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22  w=%d cells=%d\n"
2b5f0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ,.          pPag
2b600 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e  e->pgno, nOld, n
2b610 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20  New, nCell));.  
2b620 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2b630 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
2b640 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43  age(pPage);.  pC
2b650 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 72  ur->iPage--;.  r
2b660 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
2b670 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20  , 0);.  .  /*.  
2b680 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72  ** Cleanup befor
2b690 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
2b6a0 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  /.balance_cleanu
2b6b0 70 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  p:.  sqlite3Page
2b6c0 46 72 65 65 28 61 53 70 61 63 65 32 29 3b 0a 20  Free(aSpace2);. 
2b6d0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
2b6e0 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66  ree(apCell);.  f
2b6f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
2b700 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
2b710 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
2b720 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2b730 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
2b740 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
2b750 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  New[i]);.  }.  p
2b760 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2b770 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66  ->iPage]->nOverf
2b780 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  low = 0;..  retu
2b790 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b7a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2b7b0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72  called for the r
2b7c0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74  oot page of a bt
2b7d0 72 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f  ree when the roo
2b7e0 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  t.** page contai
2b7f0 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68  ns no cells.  Th
2b800 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75  is is an opportu
2b810 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65  nity to make the
2b820 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77   tree.** shallow
2b830 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e  er by one level.
2b840 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2b850 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
2b860 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2b870 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2b880 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2b890 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
2b8a0 20 42 2d 54 72 65 65 20 2a 2f 0a 20 20 4d 65 6d   B-Tree */.  Mem
2b8b0 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20  Page *pChild;   
2b8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b8d0 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65   only child page
2b8e0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50   of pPage */.  P
2b8f0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
2b900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b910 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
2b920 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72  Child */.  int r
2b930 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2b940 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2b950 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70  n code from subp
2b960 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42  rocedures */.  B
2b970 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b990 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65  * The main BTree
2b9a0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2b9b0 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  int mxCellPerPag
2b9c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2b9d0 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2b9e0 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65  f cells per page
2b9f0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2ba00 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2ba10 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
2ba20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67  from pages being
2ba30 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
2ba40 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2ba60 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
2ba70 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73   cells */..  ass
2ba80 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2ba90 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ==0 );.  pPage =
2baa0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2bab0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2bac0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2bad0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2bae0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2baf0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2bb00 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
2bb10 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50  ->pBt;.  mxCellP
2bb20 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c  erPage = MX_CELL
2bb30 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20  (pBt);.  apCell 
2bb40 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2bb50 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28   mxCellPerPage*(
2bb60 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65  sizeof(u8*)+size
2bb70 6f 66 28 75 31 36 29 29 20 29 3b 0a 20 20 69 66  of(u16)) );.  if
2bb80 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65  ( apCell==0 ) re
2bb90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2bba0 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75  M;.  szCell = (u
2bbb0 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65  16*)&apCell[mxCe
2bbc0 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66  llPerPage];.  if
2bbd0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2bbe0 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  .    /* The tabl
2bbf0 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
2bc00 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41  empty */.    TRA
2bc10 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d  CE(("BALANCE: em
2bc20 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c  pty table %d\n",
2bc30 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
2bc40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2bc50 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
2bc60 20 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f   empty but has o
2bc70 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73  ne child.  Trans
2bc80 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69  fer the.    ** i
2bc90 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2bca0 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69  that one child i
2bcb0 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67  nto the root pag
2bcc0 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20  e if it .    ** 
2bcd0 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20  will fit.  This 
2bce0 72 65 64 75 63 65 73 20 74 68 65 20 64 65 70 74  reduces the dept
2bcf0 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 62 79  h of the tree by
2bd00 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
2bd10 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20   ** If the root 
2bd20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 2c 20  page is page 1, 
2bd30 69 74 20 68 61 73 20 6c 65 73 73 20 73 70 61 63  it has less spac
2bd40 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e  e available than
2bd50 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c  .    ** its chil
2bd60 64 20 28 64 75 65 20 74 6f 20 74 68 65 20 31 30  d (due to the 10
2bd70 30 20 62 79 74 65 20 68 65 61 64 65 72 20 74 68  0 byte header th
2bd80 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
2bd90 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a   beginning.    *
2bda0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
2bdb0 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69  e fle), so it mi
2bdc0 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ght not be able 
2bdd0 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74  to hold all of t
2bde0 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  he .    ** infor
2bdf0 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  mation currently
2be00 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2be10 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69  e child.  If thi
2be20 73 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  s is the .    **
2be30 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e   case, then do n
2be40 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66  ot do the transf
2be50 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20  er.  Leave page 
2be60 31 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20  1 empty except. 
2be70 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69     ** for the ri
2be80 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74  ght-pointer to t
2be90 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  he child page.  
2bea0 54 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62  The child page b
2beb0 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68  ecomes.    ** th
2bec0 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f  e virtual root o
2bed0 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20  f the tree..    
2bee0 2a 2f 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  */.    VVA_ONLY(
2bef0 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66   pCur->pagesShuf
2bf00 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 20 20  fled = 1 );.    
2bf10 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34  pgnoChild = get4
2bf20 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2bf30 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2bf40 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
2bf50 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30  ert( pgnoChild>0
2bf60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2bf70 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72  pgnoChild<=pager
2bf80 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d  Pagecount(pPage-
2bf90 3e 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  >pBt) );.    rc 
2bfa0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2bfb0 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74  tPage(pPage->pBt
2bfc0 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43  , pgnoChild, &pC
2bfd0 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66  hild, 0);.    if
2bfe0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2bff0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
2c000 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2c010 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
2c020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2c030 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
2c040 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
2c050 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c   ) goto end_shal
2c060 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
2c070 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c     assert( pChil
2c080 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  d->nOverflow==0 
2c090 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  );.      if( pCh
2c0a0 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20  ild->nFree>=100 
2c0b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2c0c0 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74  e child informat
2c0d0 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ion will fit on 
2c0e0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73  the root page, s
2c0f0 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20  o do the.       
2c100 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20   ** copy */.    
2c110 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2c120 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2c130 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
2c140 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
2c150 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d  r(i=0; i<pChild-
2c160 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
2c170 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69          apCell[i
2c180 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68  ] = findCell(pCh
2c190 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20  ild,i);.        
2c1a0 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65    szCell[i] = ce
2c1b0 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64  llSizePtr(pChild
2c1c0 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20  , apCell[i]);.  
2c1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c1e0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61  assemblePage(pPa
2c1f0 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ge, pChild->nCel
2c200 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  l, apCell, szCel
2c210 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l);.        /* C
2c220 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f  opy the right-po
2c230 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
2c240 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ld to the parent
2c250 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
2c260 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2c270 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2c280 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2c290 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2c2a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2c2b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2c2c0 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  8], .           
2c2d0 20 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c   get4byte(&pChil
2c2e0 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d  d->aData[pChild-
2c2f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
2c300 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
2c310 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
2c320 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2c330 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
2c340 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61  d transfer to pa
2c350 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
2c360 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
2c370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2c380 20 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d   The child has m
2c390 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
2c3a0 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  that will fit on
2c3b0 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20   the root..     
2c3c0 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69     ** The tree i
2c3d0 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63  s already balanc
2c3e0 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e  ed.  Do nothing.
2c3f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43   */.        TRAC
2c400 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
2c410 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66  ld %d will not f
2c420 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c  it on page 1\n",
2c430 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2c440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2c450 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  se{.      memcpy
2c460 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70  (pPage->aData, p
2c470 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50  Child->aData, pP
2c480 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2c490 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
2c4a0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2c4b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c4c0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2c4d0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 61 73  pPage);.      as
2c4e0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2c4f0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65  _OK );.      fre
2c500 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2c510 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
2c520 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63  ANCE: transfer c
2c530 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f  hild %d into roo
2c540 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t %d\n",.       
2c550 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70         pChild->p
2c560 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  gno, pPage->pgno
2c570 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ));.    }.    as
2c580 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2c590 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66  erflow==0 );.#if
2c5a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c5b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2c5c0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2c5d0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2c5e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2c5f0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2c600 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  pPage);.    }.#e
2c610 6e 64 69 66 0a 20 20 20 20 72 65 6c 65 61 73 65  ndif.    release
2c620 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2c630 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  }.end_shallow_ba
2c640 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33  lance:.  sqlite3
2c650 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  _free(apCell);. 
2c660 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2c670 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70  /*.** The root p
2c680 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a  age is overfull.
2c690 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2c6a0 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20  happens, Create 
2c6b0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2c6c0 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a   and copy the.**
2c6d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2c6e0 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63   root into the c
2c6f0 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65  hild.  Then make
2c700 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
2c710 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  e an empty page 
2c720 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20  with rightChild 
2c730 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2c740 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20  new.** child.   
2c750 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61  Finally, call ba
2c760 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29  lance_internal()
2c770 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c   on the new chil
2c780 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74  d.** to cause it
2c790 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74   to split..*/.st
2c7a0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2c7b0 5f 64 65 65 70 65 72 28 42 74 43 75 72 73 6f 72  _deeper(BtCursor
2c7c0 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
2c7d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
2c7e0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
2c7f0 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
2c800 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
2c810 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 50 6f  pPage;     /* Po
2c820 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 6f 6f  inter to the roo
2c830 74 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50  t page */.  MemP
2c840 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20  age *pChild;    
2c850 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
2c860 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
2c870 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
2c880 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ld;     /* Page 
2c890 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
2c8a0 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
2c8b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2c8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c8d0 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75  BTree */.  int u
2c8e0 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  sableSize;     /
2c8f0 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73  * Total usable s
2c900 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f  ize of a page */
2c910 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2c920 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2c930 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  t of the parent 
2c940 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64  page */.  u8 *cd
2c950 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
2c960 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
2c970 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
2c980 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
2c990 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2c9a0 20 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20   page header in 
2c9b0 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  parent */.  int 
2c9c0 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
2c9d0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e  /* Offset to con
2c9e0 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65  tent of first ce
2c9f0 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  ll in parent */.
2ca00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2ca10 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >iPage==0 );.  a
2ca20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2ca30 61 67 65 5b 30 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  age[0]->nOverflo
2ca40 77 3e 30 20 29 3b 0a 0a 20 20 56 56 41 5f 4f 4e  w>0 );..  VVA_ON
2ca50 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53  LY( pCur->pagesS
2ca60 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20  huffled = 1 );. 
2ca70 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2ca80 70 50 61 67 65 5b 30 5d 3b 0a 20 20 70 42 74 20  pPage[0];.  pBt 
2ca90 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2caa0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2cab0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2cac0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2cad0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2cae0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2caf0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
2cb00 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2cb10 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43  reePage(pBt, &pC
2cb20 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64  hild, &pgnoChild
2cb30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30  , pPage->pgno, 0
2cb40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2cb50 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
2cb60 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2cb70 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
2cb80 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
2cb90 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
2cba0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
2cbb0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2cbc0 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
2cbd0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2cbe0 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74    cbrk = get2byt
2cbf0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
2cc00 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c  .  cdata = pChil
2cc10 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63  d->aData;.  memc
2cc20 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b  py(cdata, &data[
2cc30 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c  hdr], pPage->cel
2cc40 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d  lOffset+2*pPage-
2cc50 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d  >nCell-hdr);.  m
2cc60 65 6d 63 70 79 28 26 63 64 61 74 61 5b 63 62 72  emcpy(&cdata[cbr
2cc70 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
2cc80 20 75 73 61 62 6c 65 53 69 7a 65 2d 63 62 72 6b   usableSize-cbrk
2cc90 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  );..  assert( pC
2cca0 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  hild->isInit==0 
2ccb0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2ccc0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
2ccd0 43 68 69 6c 64 29 3b 0a 20 20 69 66 28 20 72 63  Child);.  if( rc
2cce0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ccf0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
2cd00 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a  Page->nOverflow*
2cd10 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
2cd20 76 66 6c 5b 30 5d 29 3b 0a 20 20 20 20 6d 65 6d  vfl[0]);.    mem
2cd30 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
2cd40 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c  l, pPage->aOvfl,
2cd50 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 70 43 68   nCopy);.    pCh
2cd60 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
2cd70 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2cd80 77 3b 0a 20 20 20 20 69 66 28 20 70 43 68 69 6c  w;.    if( pChil
2cd90 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  d->nOverflow ){.
2cda0 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46        pChild->nF
2cdb0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ree = 0;.    }. 
2cdc0 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c     assert( pChil
2cdd0 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d  d->nCell==pPage-
2cde0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 61 73  >nCell );.    as
2cdf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2ce00 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2ce10 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2ce20 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
2ce30 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
2ce40 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
2ce50 46 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  F);.    put4byte
2ce60 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2ce70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2ce80 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
2ce90 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2cea0 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
2ceb0 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50  d into %d\n", pP
2cec0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  age->pgno, pChil
2ced0 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 69  d->pgno));.    i
2cee0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2cef0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
2cf00 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68  rmapPut(pBt, pCh
2cf10 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  ild->pgno, PTRMA
2cf20 50 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e  P_BTREE, pPage->
2cf30 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
2cf40 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2cf50 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
2cf60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cf70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
2cf80 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 43  tChildPtrmaps(pC
2cf90 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  hild);.      }. 
2cfa0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2cfb0 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e         pChild->n
2cfc0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
2cfd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2cfe0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
2cff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d000 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b     pCur->iPage++
2d010 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
2d020 67 65 5b 31 5d 20 3d 20 70 43 68 69 6c 64 3b 0a  ge[1] = pChild;.
2d030 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2d040 30 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  0] = 0;.    rc =
2d050 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
2d060 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
2d070 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2d080 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a 20  (pChild);.  }.. 
2d090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d0a0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68  *.** The page th
2d0b0 61 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c  at pCur currentl
2d0c0 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  y points to has 
2d0d0 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69  just been modifi
2d0e0 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61  ed in.** some wa
2d0f0 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
2d100 20 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20   figures out if 
2d110 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f  this modificatio
2d120 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74  n means the.** t
2d130 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ree needs to be 
2d140 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66  balanced, and if
2d150 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70   so calls the ap
2d160 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63  propriate balanc
2d170 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  ing .** routine.
2d180 0a 2a 2a 20 0a 2a 2a 20 50 61 72 61 6d 65 74 65  .** .** Paramete
2d190 72 20 69 73 49 6e 73 65 72 74 20 69 73 20 74 72  r isInsert is tr
2d1a0 75 65 20 69 66 20 61 20 6e 65 77 20 63 65 6c 6c  ue if a new cell
2d1b0 20 77 61 73 20 6a 75 73 74 20 69 6e 73 65 72 74   was just insert
2d1c0 65 64 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 70  ed into the.** p
2d1d0 61 67 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  age, or false ot
2d1e0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
2d1f0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42  ic int balance(B
2d200 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2d210 6e 74 20 69 73 49 6e 73 65 72 74 29 7b 0a 20 20  nt isInsert){.  
2d220 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d230 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
2d240 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2d250 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2d260 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2d270 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d280 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2d290 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  x) );.  if( pCur
2d2a0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2d2b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d2c0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2d2d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2d2e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d2f0 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  && pPage->nOverf
2d300 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  low>0 ){.      r
2d310 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  c = balance_deep
2d320 65 72 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  er(pCur);.      
2d330 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2d340 50 61 67 65 5b 30 5d 3d 3d 70 50 61 67 65 20 29  Page[0]==pPage )
2d350 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2d360 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2d370 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  ==0 || rc!=SQLIT
2d380 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20  E_OK );.    }.  
2d390 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d3a0 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43  _OK && pPage->nC
2d3b0 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ell==0 ){.      
2d3c0 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61  rc = balance_sha
2d3d0 6c 6c 6f 77 65 72 28 70 43 75 72 29 3b 0a 20 20  llower(pCur);.  
2d3e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2d3f0 2d 3e 61 70 50 61 67 65 5b 30 5d 3d 3d 70 50 61  ->apPage[0]==pPa
2d400 67 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge );.      asse
2d410 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2d420 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63 21 3d 53  flow==0 || rc!=S
2d430 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2d440 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
2d450 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
2d460 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20  low>0 || .      
2d470 20 20 28 21 69 73 49 6e 73 65 72 74 20 26 26 20    (!isInsert && 
2d480 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61  pPage->nFree>pPa
2d490 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2d4a0 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20  ize*2/3) ){.    
2d4b0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
2d4c0 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  onroot(pCur);.  
2d4d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2d4e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2d4f0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
2d500 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68  s all cursors th
2d510 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c  at point to tabl
2d520 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49  e pgnoRoot..** I
2d530 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63  f any of those c
2d540 75 72 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e  ursors were open
2d550 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
2d560 30 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  0 in a different
2d570 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2d580 6e 65 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62  nection (a datab
2d590 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
2d5a0 68 61 74 20 73 68 61 72 65 73 20 74 68 65 20 70  hat shares the p
2d5b0 61 67 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69  ager.** cache wi
2d5c0 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  th the current c
2d5d0 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74  onnection) and t
2d5e0 68 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  hat other connec
2d5f0 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  tion .** is not 
2d600 69 6e 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  in the ReadUncom
2d610 6d 6d 69 74 74 65 64 20 73 74 61 74 65 2c 20 74  mmitted state, t
2d620 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2d630 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
2d640 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a  ITE_LOCKED..**.*
2d650 2a 20 41 73 20 77 65 6c 6c 20 61 73 20 63 75 72  * As well as cur
2d660 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61 67  sors with wrFlag
2d670 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20 77 69 74  ==0, cursors wit
2d680 68 20 77 72 46 6c 61 67 3d 3d 31 20 61 6e 64 20  h wrFlag==1 and 
2d690 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f 62 48 61  .** isIncrblobHa
2d6a0 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61 6c 73 6f  ndle==1 are also
2d6b0 20 63 6f 6e 73 69 64 65 72 65 64 20 27 72 65 61   considered 'rea
2d6c0 64 27 20 63 75 72 73 6f 72 73 2e 20 49 6e 63 72  d' cursors. Incr
2d6d0 65 6d 65 6e 74 61 6c 20 0a 2a 2a 20 62 6c 6f 62  emental .** blob
2d6e0 20 63 75 72 73 6f 72 73 20 61 72 65 20 75 73 65   cursors are use
2d6f0 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69  d for both readi
2d700 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a  ng and writing..
2d710 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52  **.** When pgnoR
2d720 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20  oot is the root 
2d730 70 61 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65  page of an intke
2d740 79 20 74 61 62 6c 65 2c 20 74 68 69 73 20 66 75  y table, this fu
2d750 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a  nction is also.*
2d760 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  * responsible fo
2d770 72 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 69  r invalidating i
2d780 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2d790 63 75 72 73 6f 72 73 20 77 68 65 6e 20 74 68 65  cursors when the
2d7a0 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e   table row.** on
2d7b0 20 77 68 69 63 68 20 74 68 65 79 20 61 72 65 20   which they are 
2d7c0 6f 70 65 6e 65 64 20 69 73 20 64 65 6c 65 74 65  opened is delete
2d7d0 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20 43  d or modified. C
2d7e0 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
2d7f0 69 64 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  idated.** accord
2d800 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ing to the follo
2d810 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  wing rules:.**.*
2d820 2a 20 20 20 31 29 20 57 68 65 6e 20 42 74 72 65  *   1) When Btre
2d830 65 43 6c 65 61 72 54 61 62 6c 65 28 29 20 69 73  eClearTable() is
2d840 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
2d850 65 74 65 6c 79 20 64 65 6c 65 74 65 20 74 68 65  etely delete the
2d860 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20   contents.**    
2d870 20 20 6f 66 20 61 20 42 2d 54 72 65 65 20 74 61    of a B-Tree ta
2d880 62 6c 65 2c 20 70 45 78 63 6c 75 64 65 20 69 73  ble, pExclude is
2d890 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64   set to zero and
2d8a0 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20   parameter iRow 
2d8b0 69 73 20 0a 2a 2a 20 20 20 20 20 20 73 65 74 20  is .**      set 
2d8c0 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  to non-zero. In 
2d8d0 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 69 6e  this case all in
2d8e0 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
2d8f0 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20  ursors open.**  
2d900 20 20 20 20 6f 6e 20 74 68 65 20 74 61 62 6c 65      on the table
2d910 20 72 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f 52   rooted at pgnoR
2d920 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c 69 64 61  oot are invalida
2d930 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  ted..**.**   2) 
2d940 57 68 65 6e 20 42 74 72 65 65 49 6e 73 65 72 74  When BtreeInsert
2d950 28 29 2c 20 42 74 72 65 65 44 65 6c 65 74 65 28  (), BtreeDelete(
2d960 29 20 6f 72 20 42 74 72 65 65 50 75 74 44 61 74  ) or BtreePutDat
2d970 61 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  a() is called to
2d980 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66 79   .**      modify
2d990 20 61 20 74 61 62 6c 65 20 72 6f 77 20 76 69 61   a table row via
2d9a0 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
2d9b0 74 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73  t, pExclude is s
2d9c0 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20  et to the .**   
2d9d0 20 20 20 77 72 69 74 65 20 63 75 72 73 6f 72 20     write cursor 
2d9e0 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20 6d  used to do the m
2d9f0 6f 64 69 66 69 63 61 74 69 6f 6e 20 61 6e 64 20  odification and 
2da00 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69  parameter iRow i
2da10 73 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f  s set.**      to
2da20 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f 77   the integer row
2da30 20 69 64 20 6f 66 20 74 68 65 20 42 2d 54 72 65   id of the B-Tre
2da40 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f  e entry being mo
2da50 64 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a  dified. Unless.*
2da60 2a 20 20 20 20 20 20 70 45 78 63 6c 75 64 65 20  *      pExclude 
2da70 69 73 20 69 74 73 65 6c 66 20 61 6e 20 69 6e 63  is itself an inc
2da80 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75  remental blob cu
2da90 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69  rsor, then all i
2daa0 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20  ncremental.**   
2dab0 20 20 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20     blob cursors 
2dac0 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77  open on row iRow
2dad0 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 61   of the B-Tree a
2dae0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  re invalidated..
2daf0 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66 20 62 6f  **.**   3) If bo
2db00 74 68 20 70 45 78 63 6c 75 64 65 20 61 6e 64 20  th pExclude and 
2db10 69 52 6f 77 20 61 72 65 20 73 65 74 20 74 6f 20  iRow are set to 
2db20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65  zero, no increme
2db30 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20  ntal blob .**   
2db40 20 20 20 63 75 72 73 6f 72 73 20 61 72 65 20 69     cursors are i
2db50 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73  nvalidated..*/.s
2db60 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
2db70 65 61 64 4c 6f 63 6b 73 28 0a 20 20 42 74 72 65  eadLocks(.  Btre
2db80 65 20 2a 70 42 74 72 65 65 2c 20 0a 20 20 50 67  e *pBtree, .  Pg
2db90 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 0a 20 20  no pgnoRoot, .  
2dba0 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75  BtCursor *pExclu
2dbb0 64 65 2c 0a 20 20 69 36 34 20 69 52 6f 77 0a 29  de,.  i64 iRow.)
2dbc0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
2dbd0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2dbe0 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
2dbf0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2dc00 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 61 73  pBtree->db;.  as
2dc10 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
2dc20 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
2dc30 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
2dc40 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
2dc50 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
2dc60 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64    if( p==pExclud
2dc70 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
2dc80 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
2dc90 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f  t!=pgnoRoot ) co
2dca0 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
2dcb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
2dcc0 42 4c 4f 42 0a 20 20 20 20 69 66 28 20 70 2d 3e  BLOB.    if( p->
2dcd0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
2dce0 20 26 26 20 28 20 0a 20 20 20 20 20 20 20 20 20   && ( .         
2dcf0 28 21 70 45 78 63 6c 75 64 65 20 26 26 20 69 52  (!pExclude && iR
2dd00 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20 28 70 45  ow).      || (pE
2dd10 78 63 6c 75 64 65 20 26 26 20 21 70 45 78 63 6c  xclude && !pExcl
2dd20 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ude->isIncrblobH
2dd30 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e 66 6f  andle && p->info
2dd40 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20  .nKey==iRow).   
2dd50 20 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53   )){.      p->eS
2dd60 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2dd70 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23 65 6e  VALID;.    }.#en
2dd80 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  dif.    if( p->e
2dd90 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2dda0 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LID ) continue;.
2ddb0 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61      if( p->wrFla
2ddc0 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20 53 51  g==0 .#ifndef SQ
2ddd0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
2dde0 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e 69 73  OB.     || p->is
2ddf0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 0a 23  IncrblobHandle.#
2de00 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20  endif.    ){.   
2de10 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f 74     sqlite3 *dbOt
2de20 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d  her = p->pBtree-
2de30 3e 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20 64  >db;.      if( d
2de40 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20  bOther==0 ||.   
2de50 20 20 20 20 20 20 28 64 62 4f 74 68 65 72 21 3d        (dbOther!=
2de60 64 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e  db && (dbOther->
2de70 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
2de80 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d  eadUncommitted)=
2de90 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =0) ){.        r
2dea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2deb0 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KED;.      }.   
2dec0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2ded0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2dee0 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
2def0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2df00 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79   BTree.  The key
2df10 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b   is given by (pK
2df20 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20  ey,nKey).** and 
2df30 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65  the data is give
2df40 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74  n by (pData,nDat
2df50 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  a).  The cursor 
2df60 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a  is used only to.
2df70 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74  ** define what t
2df80 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20  able the record 
2df90 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
2dfa0 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75  ed into.  The cu
2dfb0 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
2dfc0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
2dfd0 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
2dfe0 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b  *.** For an INTK
2dff0 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74  EY table, only t
2e000 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66  he nKey value of
2e010 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64   the key is used
2e020 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67  .  pKey is.** ig
2e030 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45  nored.  For a ZE
2e040 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68  RODATA table, th
2e050 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74  e pData and nDat
2e060 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72  a are both ignor
2e070 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2e080 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20  e3BtreeInsert(. 
2e090 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0b0 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
2e0c0 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66  nto the table of
2e0d0 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
2e0e0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
2e0f0 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
2e100 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74   /* The key of t
2e110 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
2e120 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2e130 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c  Data, int nData,
2e140 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66    /* The data of
2e150 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
2e160 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
2e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e180 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e190 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74   extra 0 bytes t
2e1a0 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61  o append to data
2e1b0 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64   */.  int append
2e1c0 42 69 61 73 20 20 20 20 20 20 20 20 20 20 20 20  Bias            
2e1d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2e1e0 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61  this is likely a
2e1f0 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20  n append */.){. 
2e200 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
2e210 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b  oc;.  int szNew;
2e220 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
2e230 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2e240 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
2e250 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
2e260 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2e270 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
2e280 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75  ar *oldCell;.  u
2e290 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65  nsigned char *ne
2e2a0 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73  wCell = 0;..  as
2e2b0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2e2c0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2e2d0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2e2e0 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2e2f0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2e300 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2e310 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
2e320 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74 20  doing an insert 
2e330 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
2e340 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2e350 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2e360 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2e370 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2e380 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2e390 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28  eadOnly );.  if(
2e3a0 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29   !pCur->wrFlag )
2e3b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2e3c0 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43  ITE_PERM;   /* C
2e3d0 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66  ursor not open f
2e3e0 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  or writing */.  
2e3f0 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  }.  if( checkRea
2e400 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74  dLocks(pCur->pBt
2e410 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
2e420 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29  oot, pCur, nKey)
2e430 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2e440 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
2e450 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
2e460 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
2e470 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
2e480 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2e490 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2e4a0 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2e4b0 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
2e4c0 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70  .  /* Save the p
2e4d0 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
2e4e0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70  other cursors op
2e4f0 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
2e500 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
2e510 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
2e520 75 72 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20  ur);.  if( .    
2e530 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2e540 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2e550 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2e560 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20  oot, pCur)) ||. 
2e570 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
2e580 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e590 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65  Moveto(pCur, pKe
2e5a0 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42  y, nKey, appendB
2e5b0 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b  ias, &loc)).  ){
2e5c0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2e5d0 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2e5e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e5f0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
2e600 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
2e610 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  y || nKey>=0 );.
2e620 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e630 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d  >leaf || !pPage-
2e640 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52 41  >intKey );.  TRA
2e650 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62  CE(("INSERT: tab
2e660 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20  le=%d nkey=%lld 
2e670 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64  ndata=%d page=%d
2e680 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
2e690 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2e6a0 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70  , nKey, nData, p
2e6b0 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20  Page->pgno,.    
2e6c0 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22        loc==0 ? "
2e6d0 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65  overwrite" : "ne
2e6e0 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73  w entry"));.  as
2e6f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2e700 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74  nit );.  allocat
2e710 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
2e720 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74  .  newCell = pBt
2e730 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69  ->pTmpSpace;.  i
2e740 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20  f( newCell==0 ) 
2e750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2e760 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c  MEM;.  rc = fill
2e770 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65  InCell(pPage, ne
2e780 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65  wCell, pKey, nKe
2e790 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c  y, pData, nData,
2e7a0 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b   nZero, &szNew);
2e7b0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2e7c0 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61   end_insert;.  a
2e7d0 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65  ssert( szNew==ce
2e7e0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2e7f0 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61   newCell) );.  a
2e800 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58  ssert( szNew<=MX
2e810 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
2e820 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d  );.  idx = pCur-
2e830 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e840 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d  ge];.  if( loc==
2e850 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49  0 && CURSOR_VALI
2e860 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2e870 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64  ){.    u16 szOld
2e880 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
2e890 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2e8a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e8b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2e8c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2e8d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2e8e0 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
2e8f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64  t;.    }.    old
2e900 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2e910 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20  pPage, idx);.   
2e920 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2e930 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  f ){.      memcp
2e940 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65  y(newCell, oldCe
2e950 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 4);.    }.  
2e960 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69    szOld = cellSi
2e970 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64  zePtr(pPage, old
2e980 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Cell);.    rc = 
2e990 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2e9a0 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69   oldCell);.    i
2e9b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2e9c0 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 72 63 20  _insert;.    rc 
2e9d0 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65  = dropCell(pPage
2e9e0 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20  , idx, szOld);. 
2e9f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ea00 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 67  E_OK ) {.      g
2ea10 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2ea20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2ea30 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65  ( loc<0 && pPage
2ea40 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
2ea50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ea60 6c 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78 20  leaf );.    idx 
2ea70 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
2ea80 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2ea90 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2eaa0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
2eab0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
2eac0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2ead0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
2eae0 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  f );.  }.  rc = 
2eaf0 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
2eb00 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20  , idx, newCell, 
2eb10 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20  szNew, 0, 0);.  
2eb20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2eb30 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61  K ){.    rc = ba
2eb40 6c 61 6e 63 65 28 70 43 75 72 2c 20 31 29 3b 0a  lance(pCur, 1);.
2eb50 20 20 7d 0a 0a 20 20 2f 2a 20 4d 75 73 74 20 6d    }..  /* Must m
2eb60 61 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c  ake sure nOverfl
2eb70 6f 77 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a  ow is reset to z
2eb80 65 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20  ero even if the 
2eb90 62 61 6c 61 6e 63 65 28 29 0a 20 20 2a 2a 20 66  balance().  ** f
2eba0 61 69 6c 73 2e 20 20 49 6e 74 65 72 6e 61 6c 20  ails.  Internal 
2ebb0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
2ebc0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72  orruption will r
2ebd0 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e  esult otherwise.
2ebe0 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 61 70 50 61   */.  pCur->apPa
2ebf0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2ec00 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
2ec10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ec20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
2ec30 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2ec40 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20  }.end_insert:.  
2ec50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ec60 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65  .** Delete the e
2ec70 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75  ntry that the cu
2ec80 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
2ec90 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72   to.  The cursor
2eca0 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2ecb0 74 69 6e 67 20 61 74 20 61 20 61 72 62 69 74 72  ting at a arbitr
2ecc0 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  ary location..*/
2ecd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2ece0 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
2ecf0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2ed00 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2ed10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2ed20 50 61 67 65 5d 3b 0a 20 20 69 6e 74 20 69 64 78  Page];.  int idx
2ed30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2ed40 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  r *pCell;.  int 
2ed50 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43  rc;.  Pgno pgnoC
2ed60 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65  hild = 0;.  Btre
2ed70 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
2ed80 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
2ed90 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
2eda0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2edb0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2edc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2edd0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2ede0 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
2edf0 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57  saction!=TRANS_W
2ee00 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d  RITE ){.    /* M
2ee10 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
2ee20 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64  saction before d
2ee30 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f  oing a delete */
2ee40 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
2ee50 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2ee60 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2ee70 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
2ee80 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2ee90 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
2eea0 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70  dOnly );.  if( p
2eeb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2eec0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
2eed0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
2eee0 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  ip;.  }.  if( pC
2eef0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2ef00 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
2ef10 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Cell ){.    retu
2ef20 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2ef30 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2ef40 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2ef50 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  to anything */. 
2ef60 20 7d 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e   }.  if( !pCur->
2ef70 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
2ef80 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2ef90 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f  ;   /* Did not o
2efa0 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20  pen this cursor 
2efb0 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2efc0 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
2efd0 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42  adLocks(pCur->pB
2efe0 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
2eff0 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72  Root, pCur, pCur
2f000 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a  ->info.nKey) ){.
2f010 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f020 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65  E_LOCKED; /* The
2f030 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e   table pCur poin
2f040 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64  ts to has a read
2f050 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20   lock */.  }..  
2f060 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  /* Restore the c
2f070 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
2f080 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20  sition (a no-op 
2f090 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2f0a0 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55   not in .  ** CU
2f0b0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2f0c0 20 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65   state) and save
2f0d0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
2f0e0 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
2f0f0 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f  ors .  ** open o
2f100 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
2f110 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69  . Then call sqli
2f120 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2f130 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a  on the page.  **
2f140 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
2f150 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
2f160 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  from..  */.  if(
2f170 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73 74   .    (rc = rest
2f180 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2f190 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20  n(pCur))!=0 ||. 
2f1a0 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c     (rc = saveAll
2f1b0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
2f1c0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2f1d0 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
2f1e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f1f0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2f200 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20  Page))!=0.  ){. 
2f210 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f220 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
2f230 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69  he cell within i
2f240 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  ts page and leav
2f250 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
2f260 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
2f270 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
2f280 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
2f290 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2f2a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2f2b0 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
2f2c0 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
2f2d0 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
2f2e0 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43  .  */.  idx = pC
2f2f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2f300 69 50 61 67 65 5d 3b 0a 20 20 70 43 65 6c 6c 20  iPage];.  pCell 
2f310 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2f320 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70  , idx);.  if( !p
2f330 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2f340 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2f350 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
2f360 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43   }.  rc = clearC
2f370 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2f380 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2f390 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f3a0 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
2f3b0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a  >leaf ){.    /*.
2f3c0 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79      ** The entry
2f3d0 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
2f3e0 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61   delete is not a
2f3f0 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64   leaf so if we d
2f400 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20  o not.    ** do 
2f410 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c  something we wil
2f420 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f  l leave a hole o
2f430 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61  n an internal pa
2f440 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61  ge..    ** We ha
2f450 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68  ve to fill the h
2f460 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e  ole by moving in
2f470 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c   a cell from a l
2f480 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  eaf.  The.    **
2f490 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72   next Cell after
2f4a0 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64   the one to be d
2f4b0 65 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e  eleted is guaran
2f4c0 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e  teed to exist an
2f4d0 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61  d.    ** to be a
2f4e0 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20   leaf so we can 
2f4f0 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  use it..    */. 
2f500 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66     BtCursor leaf
2f510 43 75 72 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  Cur;.    MemPage
2f520 20 2a 70 4c 65 61 66 50 61 67 65 20 3d 20 30 3b   *pLeafPage = 0;
2f530 0a 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ..    unsigned c
2f540 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  har *pNext;.    
2f550 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
2f560 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2f570 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  tempCell = 0;.  
2f580 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2f590 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ->intKey );.    
2f5a0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
2f5b0 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20  empCursor(pCur, 
2f5c0 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72  &leafCur);.    r
2f5d0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2f5e0 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26  Next(&leafCur, &
2f5f0 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
2f600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f610 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2f620 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 6c   leafCur.aiIdx[l
2f630 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30  eafCur.iPage]==0
2f640 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 50   );.      pLeafP
2f650 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61 70  age = leafCur.ap
2f660 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50 61  Page[leafCur.iPa
2f670 67 65 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ge];.      rc = 
2f680 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f690 65 28 70 4c 65 61 66 50 61 67 65 2d 3e 70 44 62  e(pLeafPage->pDb
2f6a0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
2f6b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f6c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
2f6d0 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
2f6e0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 31 36  d = 0;.      u16
2f6f0 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20 20 54   szNext;.      T
2f700 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
2f710 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69  able=%d delete i
2f720 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20  nternal from %d 
2f730 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61  replace from lea
2f740 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
2f750 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2f760 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
2f770 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f 29 29  LeafPage->pgno))
2f780 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  ;.      dropCell
2f790 28 70 50 61 67 65 2c 20 69 64 78 2c 20 63 65 6c  (pPage, idx, cel
2f7a0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2f7b0 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70  pCell));.      p
2f7c0 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Next = findCell(
2f7d0 70 4c 65 61 66 50 61 67 65 2c 20 30 29 3b 0a 20  pLeafPage, 0);. 
2f7e0 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65       szNext = ce
2f7f0 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65 61 66 50  llSizePtr(pLeafP
2f800 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20  age, pNext);.   
2f810 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45     assert( MX_CE
2f820 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a  LL_SIZE(pBt)>=sz
2f830 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20  Next+4 );.      
2f840 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
2f850 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 74 65  e(pBt);.      te
2f860 6d 70 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54  mpCell = pBt->pT
2f870 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 69  mpSpace;.      i
2f880 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29  f( tempCell==0 )
2f890 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2f8a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2f8b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2f8c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f8d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73          rc = ins
2f8e0 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ertCell(pPage, i
2f8f0 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e  dx, pNext-4, szN
2f900 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c  ext+4, tempCell,
2f910 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20   0);.      }... 
2f920 20 20 20 20 20 2f 2a 20 54 68 65 20 22 69 66 22       /* The "if"
2f930 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
2f940 65 20 6e 65 78 74 20 63 6f 64 65 20 62 6c 6f 63  e next code bloc
2f950 6b 20 69 73 20 63 72 69 74 69 63 61 6c 2e 20 20  k is critical.  
2f960 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 6c 69  The.      ** sli
2f970 67 68 74 65 73 74 20 65 72 72 6f 72 20 69 6e 20  ghtest error in 
2f980 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 77  that statement w
2f990 6f 75 6c 64 20 61 6c 6c 6f 77 20 53 51 4c 69 74  ould allow SQLit
2f9a0 65 20 74 6f 20 6f 70 65 72 61 74 65 0a 20 20 20  e to operate.   
2f9b0 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20     ** correctly 
2f9c0 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 69 6d 65  most of the time
2f9d0 20 62 75 74 20 70 72 6f 64 75 63 65 20 76 65 72   but produce ver
2f9e0 79 20 72 61 72 65 20 66 61 69 6c 75 72 65 73 2e  y rare failures.
2f9f0 20 20 54 6f 0a 20 20 20 20 20 20 2a 2a 20 67 75    To.      ** gu
2fa00 61 72 64 20 61 67 61 69 6e 73 74 20 74 68 69 73  ard against this
2fa10 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
2fa20 6d 61 63 72 6f 73 20 68 65 6c 70 20 74 6f 20 76  macros help to v
2fa30 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 20  erify that.     
2fa40 20 2a 2a 20 74 68 65 20 22 69 66 22 20 73 74 61   ** the "if" sta
2fa50 74 65 6d 65 6e 74 20 69 73 20 77 65 6c 6c 20 74  tement is well t
2fa60 65 73 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ested..      */.
2fa70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2fa80 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2fa90 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
2faa0 72 65 65 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53  ree<pBt->usableS
2fab0 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20 20 20 20  ize*2/3 .       
2fac0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
2fad0 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
2fae0 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
2faf0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
2fb00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2fb10 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2fb20 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
2fb30 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ree==pBt->usable
2fb40 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20 20 20  Size*2/3 .      
2fb50 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c             && pL
2fb60 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32  eafPage->nFree+2
2fb70 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75  +szNext > pBt->u
2fb80 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b  sableSize*2/3 );
2fb90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2fba0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2fbb0 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e  w==0 && pPage->n
2fbc0 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c  Free==pBt->usabl
2fbd0 65 53 69 7a 65 2a 32 2f 33 2b 31 20 0a 20 20 20  eSize*2/3+1 .   
2fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2fbf0 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
2fc00 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74  e+2+szNext > pBt
2fc10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2fc20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2fc30 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  se( pPage->nOver
2fc40 66 6c 6f 77 3e 30 20 26 26 20 70 50 61 67 65 2d  flow>0 && pPage-
2fc50 3e 6e 46 72 65 65 3c 3d 70 42 74 2d 3e 75 73 61  >nFree<=pBt->usa
2fc60 62 6c 65 53 69 7a 65 2a 32 2f 33 0a 20 20 20 20  bleSize*2/3.    
2fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2fc80 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
2fc90 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d  +2+szNext > pBt-
2fca0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20  >usableSize*2/3 
2fcb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2fcc0 65 28 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72  e( (pPage->nOver
2fcd0 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67 65  flow>0 || (pPage
2fce0 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e 75  ->nFree > pBt->u
2fcf0 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29 0a  sableSize*2/3)).
2fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd10 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e   && pLeafPage->n
2fd20 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d  Free+2+szNext ==
2fd30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2fd40 2a 32 2f 33 20 29 3b 0a 0a 0a 20 20 20 20 20 20  *2/3 );...      
2fd50 69 66 28 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65  if( (pPage->nOve
2fd60 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67  rflow>0 || (pPag
2fd70 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e  e->nFree > pBt->
2fd80 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29  usableSize*2/3))
2fd90 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 70   &&.          (p
2fda0 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b  LeafPage->nFree+
2fdb0 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e  2+szNext > pBt->
2fdc0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 0a  usableSize*2/3).
2fdd0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2fde0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2fdf0 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
2fe00 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73  internal node is
2fe10 20 6e 6f 77 20 65 69 74 68 65 72 20 6f 76 65 72   now either over
2fe20 66 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 20 20  flowing.        
2fe30 2a 2a 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20  ** or underfull 
2fe40 61 6e 64 20 74 68 65 20 6c 65 61 66 20 6e 6f 64  and the leaf nod
2fe50 65 20 77 69 6c 6c 20 62 65 20 75 6e 64 65 72 66  e will be underf
2fe60 75 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6a 75  ull after the ju
2fe70 73 74 20 63 65 6c 6c 20 0a 20 20 20 20 20 20 20  st cell .       
2fe80 20 2a 2a 20 63 6f 70 69 65 64 20 74 6f 20 74 68   ** copied to th
2fe90 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
2fea0 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  is deleted from 
2feb0 69 74 2e 20 54 68 69 73 20 69 73 20 61 20 73 70  it. This is a sp
2fec0 65 63 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  ecial.        **
2fed0 20 63 61 73 65 20 62 65 63 61 75 73 65 20 74 68   case because th
2fee0 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  e call to balanc
2fef0 65 28 29 20 74 6f 20 63 6f 72 72 65 63 74 20 74  e() to correct t
2ff00 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
2ff10 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
2ff20 63 68 61 6e 67 65 20 74 68 65 20 74 72 65 65 20  change the tree 
2ff30 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 69 6e  structure and in
2ff40 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e  validate the con
2ff50 74 65 6e 74 73 20 6f 66 0a 20 20 20 20 20 20 20  tents of.       
2ff60 20 2a 2a 20 74 68 65 20 6c 65 61 66 43 75 72 2e   ** the leafCur.
2ff70 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61  apPage[] and lea
2ff80 66 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72  fCur.aiIdx[] arr
2ff90 61 79 73 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  ays, which will 
2ffa0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  be.        ** us
2ffb0 65 64 20 62 79 20 74 68 65 20 62 61 6c 61 6e 63  ed by the balanc
2ffc0 65 28 29 20 72 65 71 75 69 72 65 64 20 74 6f 20  e() required to 
2ffd0 63 6f 72 72 65 63 74 20 74 68 65 20 75 6e 64 65  correct the unde
2ffe0 72 66 75 6c 6c 20 6c 65 61 66 0a 20 20 20 20 20  rfull leaf.     
2fff0 20 20 20 2a 2a 20 6e 6f 64 65 2e 0a 20 20 20 20     ** node..    
30000 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
30010 2a 20 54 68 65 20 66 6f 72 6d 75 6c 61 20 75 73  * The formula us
30020 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
30030 73 69 6f 6e 20 61 62 6f 76 65 20 61 72 65 20 62  sion above are b
30040 61 73 65 64 20 6f 6e 20 66 61 63 65 74 73 20 6f  ased on facets o
30050 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
30060 20 53 51 4c 69 74 65 20 66 69 6c 65 2d 66 6f 72   SQLite file-for
30070 6d 61 74 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  mat that do not 
30080 63 68 61 6e 67 65 20 6f 76 65 72 20 74 69 6d 65  change over time
30090 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
300a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
300b0 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74  Page->nFree==pBt
300c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
300d0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  +1 );.        te
300e0 73 74 63 61 73 65 28 20 70 4c 65 61 66 50 61 67  stcase( pLeafPag
300f0 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
30100 74 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t==pBt->usableSi
30110 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20  ze*2/3+1 );.    
30120 20 20 20 20 6c 65 61 66 43 75 72 73 6f 72 49 6e      leafCursorIn
30130 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  valid = 1;.     
30140 20 7d 20 20 20 20 20 20 20 20 0a 0a 20 20 20 20   }        ..    
30150 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30160 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
30170 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
30180 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
30190 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
301a0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
301b0 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
301c0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 2c  ell(pPage, idx),
301d0 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20   pgnoChild);.   
301e0 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70       VVA_ONLY( p
301f0 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
30200 65 64 20 3d 20 30 20 29 3b 0a 20 20 20 20 20 20  ed = 0 );.      
30210 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
30220 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Cur, 0);.      }
30230 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
30240 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61  SQLITE_OK && lea
30250 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 29  fCursorInvalid )
30260 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
30270 20 6c 65 61 66 2d 6e 6f 64 65 20 69 73 20 6e 6f   leaf-node is no
30280 77 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20  w underfull and 
30290 73 6f 20 74 68 65 20 74 72 65 65 20 6e 65 65 64  so the tree need
302a0 73 20 74 6f 20 62 65 20 0a 20 20 20 20 20 20 20  s to be .       
302b0 20 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20   ** rebalanced. 
302c0 48 6f 77 65 76 65 72 2c 20 74 68 65 20 62 61 6c  However, the bal
302d0 61 6e 63 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  ance() operation
302e0 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   on the internal
302f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65  .        ** node
30300 20 61 62 6f 76 65 20 6d 61 79 20 68 61 76 65 20   above may have 
30310 6d 6f 64 69 66 69 65 64 20 74 68 65 20 73 74 72  modified the str
30320 75 63 74 75 72 65 20 6f 66 20 74 68 65 20 42 2d  ucture of the B-
30330 54 72 65 65 20 61 6e 64 0a 20 20 20 20 20 20 20  Tree and.       
30340 20 2a 2a 20 73 6f 20 74 68 65 20 63 75 72 72 65   ** so the curre
30350 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6c  nt contents of l
30360 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 5d 20  eafCur.apPage[] 
30370 61 6e 64 20 6c 65 61 66 43 75 72 2e 61 69 49 64  and leafCur.aiId
30380 78 5b 5d 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  x[].        ** m
30390 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65  ay not be truste
303a0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
303b0 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e        ** It is n
303c0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
303d0 6f 70 79 20 74 68 65 20 61 6e 63 65 73 74 72 79  opy the ancestry
303e0 20 66 72 6f 6d 20 70 43 75 72 2c 20 61 73 20 74   from pCur, as t
303f0 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20  he same.        
30400 2a 2a 20 62 61 6c 61 6e 63 65 28 29 20 63 61 6c  ** balance() cal
30410 6c 20 68 61 73 20 69 6e 76 61 6c 69 64 61 74 65  l has invalidate
30420 64 20 74 68 65 20 70 43 75 72 2d 3e 61 70 50 61  d the pCur->apPa
30430 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
30440 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 72 61  .        ** arra
30450 79 73 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ys. .        **.
30460 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63          ** The c
30470 61 6c 6c 20 74 6f 20 73 61 76 65 43 75 72 73 6f  all to saveCurso
30480 72 50 6f 73 69 74 69 6f 6e 28 29 20 62 65 6c 6f  rPosition() belo
30490 77 20 69 6e 74 65 72 6e 61 6c 6c 79 20 73 61 76  w internally sav
304a0 65 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  es the .        
304b0 2a 2a 20 6b 65 79 20 74 68 61 74 20 6c 65 61 66  ** key that leaf
304c0 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Cur is currently
304d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 43 75   pointing to. Cu
304e0 72 72 65 6e 74 6c 79 2c 20 74 68 65 72 65 0a 20  rrently, there. 
304f0 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 74 77         ** are tw
30500 6f 20 63 6f 70 69 65 73 20 6f 66 20 74 68 61 74  o copies of that
30510 20 6b 65 79 20 69 6e 20 74 68 65 20 74 72 65 65   key in the tree
30520 20 2d 20 6f 6e 65 20 68 65 72 65 20 6f 6e 20 74   - one here on t
30530 68 65 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20  he leaf.        
30540 2a 2a 20 70 61 67 65 20 61 6e 64 20 6f 6e 65 20  ** page and one 
30550 6f 6e 20 73 6f 6d 65 20 69 6e 74 65 72 6e 61 6c  on some internal
30560 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 74 72 65   node in the tre
30570 65 2e 20 54 68 65 20 63 6f 70 79 20 6f 6e 0a 20  e. The copy on. 
30580 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65         ** the le
30590 61 66 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  af node is alway
305a0 73 20 74 68 65 20 6e 65 78 74 20 6b 65 79 20 69  s the next key i
305b0 6e 20 74 72 65 65 2d 6f 72 64 65 72 20 61 66 74  n tree-order aft
305c0 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  er the .        
305d0 2a 2a 20 63 6f 70 79 20 6f 6e 20 74 68 65 20 69  ** copy on the i
305e0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f  nternal node. So
305f0 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  , the call to sq
30600 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
30610 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  .        ** call
30620 73 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  s restoreCursorP
30630 6f 73 69 74 69 6f 6e 28 29 20 74 6f 20 70 6f 69  osition() to poi
30640 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  nt the cursor to
30650 20 74 68 65 20 63 6f 70 79 0a 20 20 20 20 20 20   the copy.      
30660 20 20 2a 2a 20 73 74 6f 72 65 64 20 6f 6e 20 74    ** stored on t
30670 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
30680 2c 20 74 68 65 6e 20 61 64 76 61 6e 63 65 73 20  , then advances 
30690 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
306a0 79 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  y,.        ** wh
306b0 69 63 68 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ich happens to b
306c0 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  e the copy of th
306d0 65 20 6b 65 79 20 6f 6e 20 74 68 65 20 69 6e 74  e key on the int
306e0 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 20 20 20 20  ernal node..    
306f0 20 20 20 20 2a 2a 20 4e 65 74 20 65 66 66 65 63      ** Net effec
30700 74 3a 20 6c 65 61 66 43 75 72 20 69 73 20 70 6f  t: leafCur is po
30710 69 6e 74 69 6e 67 20 62 61 63 6b 20 74 6f 20 74  inting back to t
30720 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 65 6c  he duplicate cel
30730 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  l.        ** tha
30740 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  t needs to be re
30750 6d 6f 76 65 64 2c 20 61 6e 64 20 74 68 65 20 6c  moved, and the l
30760 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 5d 20  eafCur.apPage[] 
30770 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  and.        ** l
30780 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 20 61  eafCur.aiIdx[] a
30790 72 72 61 79 73 20 61 72 65 20 63 6f 72 72 65 63  rrays are correc
307a0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
307b0 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
307c0 50 67 6e 6f 20 6c 65 61 66 50 67 6e 6f 20 3d 20  Pgno leafPgno = 
307d0 70 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f 20  pLeafPage->pgno 
307e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
307f0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
30800 6f 6e 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20  on(&leafCur);.  
30810 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30820 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30830 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30840 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66  3BtreeNext(&leaf
30850 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  Cur, &notUsed);.
30860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30870 20 20 70 4c 65 61 66 50 61 67 65 20 3d 20 6c 65    pLeafPage = le
30880 61 66 43 75 72 2e 61 70 50 61 67 65 5b 6c 65 61  afCur.apPage[lea
30890 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20  fCur.iPage];.   
308a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
308b0 61 66 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65  afPage->pgno==le
308c0 61 66 50 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20  afPgno );.      
308d0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 75    assert( leafCu
308e0 72 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e  r.aiIdx[leafCur.
308f0 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20  iPage]==0 );.   
30900 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
30910 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20  SQLITE_OK==rc.  
30920 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
30930 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
30940 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66  PagerWrite(pLeaf
30950 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20  Page->pDbPage)) 
30960 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
30970 20 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66    dropCell(pLeaf
30980 50 61 67 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29  Page, 0, szNext)
30990 3b 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e  ;.        VVA_ON
309a0 4c 59 28 20 6c 65 61 66 43 75 72 2e 70 61 67 65  LY( leafCur.page
309b0 73 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b  sShuffled = 0 );
309c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61  .        rc = ba
309d0 6c 61 6e 63 65 28 26 6c 65 61 66 43 75 72 2c 20  lance(&leafCur, 
309e0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
309f0 72 74 28 20 6c 65 61 66 43 75 72 73 6f 72 49 6e  rt( leafCursorIn
30a00 76 61 6c 69 64 20 7c 7c 20 21 6c 65 61 66 43 75  valid || !leafCu
30a10 72 2e 70 61 67 65 73 53 68 75 66 66 6c 65 64 0a  r.pagesShuffled.
30a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a40 20 20 20 7c 7c 20 21 70 43 75 72 2d 3e 70 61 67     || !pCur->pag
30a50 65 73 53 68 75 66 66 6c 65 64 20 29 3b 0a 20 20  esShuffled );.  
30a60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
30a70 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
30a80 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c  aseTempCursor(&l
30a90 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  eafCur);.  }else
30aa0 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45  {.    TRACE(("DE
30ab0 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64  LETE: table=%d d
30ac0 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20  elete from leaf 
30ad0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43  %d\n",.       pC
30ae0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
30af0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
30b00 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70   rc = dropCell(p
30b10 50 61 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53  Page, idx, cellS
30b20 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
30b30 65 6c 6c 29 29 3b 0a 20 20 20 20 69 66 28 20 72  ell));.    if( r
30b40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30b50 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
30b60 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  ce(pCur, 0);.   
30b70 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
30b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30b90 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
30ba0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
30bb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
30bc0 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65  eate a new BTree
30bd0 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69   table.  Write i
30be0 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65  nto *piTable the
30bf0 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
30c00 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
30c10 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
30c20 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79  le..**.** The ty
30c30 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65  pe of type is de
30c40 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
30c50 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  flags parameter.
30c60 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f    Only the.** fo
30c70 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f  llowing values o
30c80 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72  f flags are curr
30c90 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f  ently in use.  O
30ca0 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a  ther values for.
30cb0 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e  ** flags might n
30cc0 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20  ot work:.**.**  
30cd0 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c     BTREE_INTKEY|
30ce0 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20  BTREE_LEAFDATA  
30cf0 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
30d00 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69  tables with rowi
30d10 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54  d keys.**     BT
30d20 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20  REE_ZERODATA    
30d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
30d40 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63  ed for SQL indic
30d50 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
30d60 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c   btreeCreateTabl
30d70 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
30d80 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
30d90 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ags){.  BtShared
30da0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
30db0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
30dc0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ;.  Pgno pgnoRoo
30dd0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
30de0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30df0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30e00 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
30e10 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
30e20 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
30e30 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
30e40 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  a transaction fi
30e50 72 73 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  rst */.    rc = 
30e60 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
30e70 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
30e80 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
30e90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30ea0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
30eb0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  t->readOnly );..
30ec0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
30ed0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30ee0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
30ef0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
30f00 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
30f10 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
30f20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
30f30 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
30f40 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
30f50 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
30f60 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d  oMove;      /* M
30f70 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20  ove a page here 
30f80 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
30f90 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a   the root-page *
30fa0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
30fb0 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65  PageMove; /* The
30fc0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
30fd0 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65  . */..    /* Cre
30fe0 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
30ff0 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72  e may probably r
31000 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
31010 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
31020 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  se.    ** to mak
31030 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  e room for the n
31040 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70  ew tables root p
31050 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69  age. In case thi
31060 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20  s page turns.   
31070 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e   ** out to be an
31080 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
31090 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66  delete all overf
310a0 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63  low page-map cac
310b0 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20  hes.    ** held 
310c0 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  by open cursors.
310d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61  .    */.    inva
310e0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
310f0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20  wCache(pBt);..  
31100 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61    /* Read the va
31110 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66  lue of meta[3] f
31120 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
31130 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
31140 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  ere the.    ** r
31150 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
31160 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  new table should
31170 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20   go. meta[3] is 
31180 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
31190 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65  -page.    ** cre
311a0 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20  ated so far, so 
311b0 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
311c0 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29  e is (meta[3]+1)
311d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
311e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
311f0 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67 6e  tMeta(p, 4, &pgn
31200 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
31210 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
31230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f  ;.    }.    pgno
31240 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  Root++;..    /* 
31250 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  The new root-pag
31260 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c  e may not be all
31270 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e  ocated on a poin
31280 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72  ter-map page, or
31290 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44   the.    ** PEND
312a0 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20  ING_BYTE page.. 
312b0 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
312c0 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41   pgnoRoot==PTRMA
312d0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67  P_PAGENO(pBt, pg
312e0 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20  noRoot) ||.     
312f0 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e     pgnoRoot==PEN
31300 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
31310 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  Bt) ){.      pgn
31320 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  oRoot++;.    }. 
31330 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52     assert( pgnoR
31340 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f  oot>=3 );..    /
31350 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67  * Allocate a pag
31360 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61 74  e. The page that
31370 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64   currently resid
31380 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77  es at pgnoRoot w
31390 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f  ill.    ** be mo
313a0 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ved to the alloc
313b0 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73  ated page (unles
313c0 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  s the allocated 
313d0 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20  page happens.   
313e0 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74   ** to reside at
313f0 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20   pgnoRoot)..    
31400 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  */.    rc = allo
31410 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
31420 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26  t, &pPageMove, &
31430 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f  pgnoMove, pgnoRo
31440 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ot, 1);.    if( 
31450 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31460 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
31470 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
31480 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52   pgnoMove!=pgnoR
31490 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  oot ){.      /* 
314a0 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20  pgnoRoot is the 
314b0 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62  page that will b
314c0 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
314d0 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20  oot-page of.    
314e0 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62    ** the new tab
314f0 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20  le (assuming an 
31500 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63  error did not oc
31510 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65 72  cur). But we wer
31520 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63  e.      ** alloc
31530 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49  ated pgnoMove. I
31540 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e  f required (i.e.
31550 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61   if it was not a
31560 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a  llocated.      *
31570 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74  * by extending t
31580 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75  he file), the cu
31590 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f  rrent page at po
315a0 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a  sition pgnoMove.
315b0 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65        ** is alre
315c0 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20  ady journaled.. 
315d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38       */.      u8
315e0 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67   eType;.      Pg
315f0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
31600 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
31610 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20  pPageMove);..   
31620 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70     /* Move the p
31630 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74  age currently at
31640 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e   pgnoRoot to pgn
31650 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20  oMove. */.      
31660 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
31670 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
31680 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
31690 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
316a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
316b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
316c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
316d0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
316e0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65  Bt, pgnoRoot, &e
316f0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
31700 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31710 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79  SQLITE_OK || eTy
31720 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
31730 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  AGE || eType==PT
31740 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
31750 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
31760 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
31770 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
31790 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
317a0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
317b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
317c0 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype!=PTRMAP_FREE
317d0 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63  PAGE );.      rc
317e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
317f0 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
31800 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
31810 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31820 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
31830 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
31840 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
31860 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
31870 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70  pBt, pRoot, eTyp
31880 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e  e, iPtrPage, pgn
31890 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  oMove, 0);.     
318a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
318b0 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f  ot);..      /* O
318c0 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 20 61  btain the page a
318d0 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20  t pgnoRoot */.  
318e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
318f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31900 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31910 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
31920 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
31930 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
31940 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
31950 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31970 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31980 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
31990 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
319a0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
319b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
319c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
319d0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
319e0 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
319f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31a00 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
31a10 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61       pRoot = pPa
31a20 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a  geMove;.    } ..
31a30 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
31a40 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e  e pointer-map an
31a50 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68  d meta-data with
31a60 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
31a70 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20  ge number. */.  
31a80 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
31a90 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
31aa0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
31ab0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
31ac0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
31ad0 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
31ae0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31af0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
31b00 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
31b10 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f  eta(p, 4, pgnoRo
31b20 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ot);.    if( rc 
31b30 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
31b40 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
31b50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31b60 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
31b70 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
31b80 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
31b90 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
31ba0 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
31bb0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
31bc0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73    }.#endif.  ass
31bd0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
31be0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f  rIswriteable(pRo
31bf0 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ot->pDbPage) );.
31c00 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
31c10 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45  , flags | PTF_LE
31c20 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  AF);.  sqlite3Pa
31c30 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e  gerUnref(pRoot->
31c40 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54  pDbPage);.  *piT
31c50 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f  able = (int)pgno
31c60 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53  Root;.  return S
31c70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
31c80 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
31c90 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
31ca0 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
31cb0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
31cc0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
31cd0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
31ce0 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  p->pBt->db = p->
31cf0 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  db;.  rc = btree
31d00 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70  CreateTable(p, p
31d10 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a  iTable, flags);.
31d20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
31d30 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
31d40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
31d50 61 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61  ase the given da
31d60 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20  tabase page and 
31d70 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e  all its children
31d80 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
31d90 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
31da0 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  elist..*/.static
31db0 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61   int clearDataba
31dc0 73 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  sePage(.  BtShar
31dd0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
31de0 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
31df0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
31e00 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e  e table */.  Pgn
31e10 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
31e20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
31e30 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20  r to clear */.  
31e40 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67  int freePageFlag
31e50 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63  ,     /* Dealloc
31e60 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65  ate page if true
31e70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61   */.  int *pnCha
31e80 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  nge.){.  MemPage
31e90 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
31ea0 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
31eb0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20  d char *pCell;. 
31ec0 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
31ed0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
31ee0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
31ef0 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ) );.  if( pgno>
31f00 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
31f10 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Bt) ){.    retur
31f20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
31f30 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63  _BKPT;.  }..  rc
31f40 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
31f50 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50  e(pBt, pgno, &pP
31f60 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
31f70 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
31f80 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66  asepage_out;.  f
31f90 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
31fa0 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
31fb0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
31fc0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
31fd0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
31fe0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
31ff0 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
32000 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
32010 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68  (pCell), 1, pnCh
32020 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  ange);.      if(
32030 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
32040 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
32050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
32060 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
32070 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
32080 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
32090 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
320a0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  t;.  }.  if( !pP
320b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
320c0 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
320d0 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
320e0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
320f0 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68  ata[8]), 1, pnCh
32100 61 6e 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  ange);.    if( r
32110 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
32120 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
32130 20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 68    }else if( pnCh
32140 61 6e 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  ange ){.    asse
32150 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
32160 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e  y );.    *pnChan
32170 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge += pPage->nCe
32180 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  ll;.  }.  if( fr
32190 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20  eePageFlag ){.  
321a0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
321b0 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20  pPage);.  }else 
321c0 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
321d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
321e0 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20  e->pDbPage))==0 
321f0 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  ){.    zeroPage(
32200 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44  pPage, pPage->aD
32210 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41  ata[0] | PTF_LEA
32220 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61  F);.  }..clearda
32230 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a  tabasepage_out:.
32240 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
32250 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
32260 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
32270 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  te all informati
32280 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  on from a single
32290 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
322a0 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20  tabase.  iTable 
322b0 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  is.** the page n
322c0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  umber of the roo
322d0 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  t of the table. 
322e0 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
322f0 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20  ine returns,.** 
32300 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
32310 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c   empty, but stil
32320 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  l exists..**.** 
32330 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
32340 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
32350 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
32360 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
32370 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ** read cursors 
32380 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f  on the table.  O
32390 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72  pen write cursor
323a0 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
323b0 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68  he.** root of th
323c0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
323d0 66 20 70 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f  f pnChange is no
323e0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62  t NULL, then tab
323f0 6c 65 20 69 54 61 62 6c 65 20 6d 75 73 74 20 62  le iTable must b
32400 65 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  e an intkey tabl
32410 65 2e 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65  e. The.** intege
32420 72 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 20  r value pointed 
32430 74 6f 20 62 79 20 70 6e 43 68 61 6e 67 65 20 69  to by pnChange i
32440 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79  s incremented by
32450 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
32460 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  * entries in the
32470 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73   table..*/.int s
32480 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
32490 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
324a0 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
324b0 2a 70 6e 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e  *pnChange){.  in
324c0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
324d0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
324e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
324f0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
32500 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
32510 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
32520 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
32530 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
32540 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
32550 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
32560 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ROR;.  }else if(
32570 20 28 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64   (rc = checkRead
32580 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c  Locks(p, iTable,
32590 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f   0, 1))!=SQLITE_
325a0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  OK ){.    /* not
325b0 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
325c0 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45  }else if( SQLITE
325d0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
325e0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69  llCursors(pBt, i
325f0 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20  Table, 0)) ){.  
32600 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
32610 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  do */.  }else{. 
32620 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
32630 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 28  abasePage(pBt, (
32640 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20  Pgno)iTable, 0, 
32650 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a 20  pnChange);.  }. 
32660 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
32670 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
32680 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
32690 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  se all informati
326a0 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e  on in a table an
326b0 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f  d add the root o
326c0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a  f the table to.*
326d0 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  * the freelist. 
326e0 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f   Except, the roo
326f0 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70  t of the princip
32700 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e  le table (the on
32710 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20  e on.** page 1) 
32720 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74  is never added t
32730 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
32740 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
32750 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
32760 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
32770 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
32780 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73   open.** cursors
32790 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   on the table..*
327a0 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55  *.** If AUTOVACU
327b0 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e  UM is enabled an
327c0 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69 54  d the page at iT
327d0 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20  able is not the 
327e0 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67  last.** root pag
327f0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
32800 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
32810 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
32820 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
32830 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65  ase file is move
32840 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20  d into the slot 
32850 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
32860 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61  d by.** iTable a
32870 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f  nd that last slo
32880 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70  t formerly occup
32890 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74 20  ied by the last 
328a0 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20  root page.** is 
328b0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
328c0 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66  elist instead of
328d0 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69   iTable.  In thi
328e0 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f  s say, all.** ro
328f0 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65 70  ot pages are kep
32900 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  t at the beginni
32910 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
32920 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a  se file, which.*
32930 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  * is necessary f
32940 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f  or AUTOVACUUM to
32950 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70   work right.  *p
32960 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
32970 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75   the .** page nu
32980 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20 74  mber that used t
32990 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f  o be the last ro
329a0 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  ot page in the f
329b0 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ile before.** th
329c0 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70  e move.  If no p
329d0 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20  age gets moved, 
329e0 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20  *piMoved is set 
329f0 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73  to 0..** The las
32a00 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72  t root page is r
32a10 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b  ecorded in meta[
32a20 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  3] and the value
32a30 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69   of.** meta[3] i
32a40 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 69  s updated by thi
32a50 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a  s procedure..*/.
32a60 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
32a70 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20  DropTable(Btree 
32a80 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
32a90 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a   int *piMoved){.
32aa0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
32ab0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
32ac0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
32ad0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
32ae0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
32af0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
32b00 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
32b10 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
32b20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
32b30 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
32b40 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
32b50 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
32b60 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c  }..  /* It is il
32b70 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20  legal to drop a 
32b80 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72  table if any cur
32b90 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e  sors are open on
32ba0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
32bb0 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  se. This is beca
32bc0 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  use in auto-vacu
32bd0 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b  um mode the back
32be0 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65  end may.  ** nee
32bf0 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65  d to move anothe
32c00 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66  r root-page to f
32c10 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62  ill a gap left b
32c20 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20  y the deleted.  
32c30 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66  ** root page. If
32c40 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
32c50 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70  was using this p
32c60 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f  age a problem wo
32c70 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e  uld .  ** occur.
32c80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
32c90 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
32ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
32cb0 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  CKED;.  }..  rc 
32cc0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
32cd0 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
32ce0 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c  )iTable, &pPage,
32cf0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
32d00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
32d10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
32d20 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62  earTable(p, iTab
32d30 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  le, 0);.  if( rc
32d40 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
32d50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
32d60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
32d70 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a    *piMoved = 0;.
32d80 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20  .  if( iTable>1 
32d90 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
32da0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
32db0 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
32dc0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
32dd0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
32de0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
32df0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
32e00 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d   ){.      Pgno m
32e10 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
32e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
32e30 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
32e40 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a   &maxRootPgno);.
32e50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32e70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
32e80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
32e90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
32ea0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  }..      if( iTa
32eb0 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f  ble==maxRootPgno
32ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
32ed0 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
32ee0 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65  g dropped is the
32ef0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
32f00 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
32f10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
32f20 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  ber in the datab
32f30 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f  ase, put the roo
32f40 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72  t page on the fr
32f50 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20  ee list. .      
32f60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
32f70 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
32f80 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
32f90 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
32fa0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32fb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
32fd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32ff0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
33000 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20  ng dropped does 
33010 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72  not have the lar
33020 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
33030 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
33040 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
33050 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61  . So move the pa
33060 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74  ge that does int
33070 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
33080 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68  * gap left by th
33090 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70  e deleted root-p
330a0 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  age..        */.
330b0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
330c0 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20  *pMove;.        
330d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
330e0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
330f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
33100 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
33110 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
33120 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
33130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33140 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
33150 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
33160 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
33170 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d  catePage(pBt, pM
33180 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  ove, PTRMAP_ROOT
33190 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c  PAGE, 0, iTable,
331a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c   0);.        rel
331b0 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  easePage(pMove);
331c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
331d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
331e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
331f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
33200 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33210 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
33220 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20  t, maxRootPgno, 
33230 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20  &pMove, 0);.    
33240 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33260 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33280 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d  rc = freePage(pM
33290 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ove);.        re
332a0 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
332b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
332c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
332d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
332e0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
332f0 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d        *piMoved =
33300 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
33310 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
33320 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78  Set the new 'max
33330 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75  -root-page' valu
33340 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
33350 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20  e header. This. 
33360 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f       ** is the o
33370 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e  ld value less on
33380 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65  e, less one more
33390 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   if that happens
333a0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20   to.      ** be 
333b0 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  a root-page numb
333c0 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61  er, less one aga
333d0 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74 68  in if that is th
333e0 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49  e.      ** PENDI
333f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20  NG_BYTE_PAGE..  
33400 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78      */.      max
33410 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
33420 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
33430 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
33440 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
33450 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
33460 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
33470 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
33480 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  o==PTRMAP_PAGENO
33490 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
334a0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  o) ){.        ma
334b0 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
334c0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
334d0 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d  t( maxRootPgno!=
334e0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
334f0 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20  E(pBt) );..     
33500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
33510 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
33520 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b  4, maxRootPgno);
33530 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33540 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
33550 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
33560 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
33570 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
33580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
33590 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  f sqlite3BtreeDr
335a0 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c  opTable was call
335b0 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f  ed on page 1. */
335c0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
335d0 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  age, PTF_INTKEY|
335e0 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20  PTF_LEAF );.    
335f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
33600 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
33610 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c   rc;  .}.int sql
33620 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
33630 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
33640 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
33650 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
33660 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
33670 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
33680 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
33690 20 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70    rc = btreeDrop
336a0 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c  Table(p, iTable,
336b0 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c   piMoved);.  sql
336c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
336d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
336e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
336f0 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  he meta-informat
33700 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74  ion out of a dat
33710 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74  abase file.  Met
33720 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e  a[0].** is the n
33730 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
33740 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
33750 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
33760 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75  Meta[1].** throu
33770 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20  gh meta[15] are 
33780 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
33790 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79 65  e by higher laye
337a0 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  rs.  Meta[0].** 
337b0 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68  is read-only, th
337c0 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 61  e others are rea
337d0 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20  d/write..** .** 
337e0 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72  The schema layer
337f0 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61   numbers meta va
33800 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79  lues differently
33810 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d 61  .  At the schema
33820 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74  .** layer (and t
33830 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64  he SetCookie and
33840 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f   ReadCookie opco
33850 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20  des) the number 
33860 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73  of.** free pages
33870 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e   is not visible.
33880 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69    So Cookie[0] i
33890 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65  s the same as Me
338a0 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ta[1]..*/.int sq
338b0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
338c0 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
338d0 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29  idx, u32 *pMeta)
338e0 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
338f0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
33900 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
33910 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61  ar *pP1;.  BtSha
33920 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
33930 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
33940 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
33950 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  t->db = p->db;..
33960 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d    /* Reading a m
33970 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72  eta-data value r
33980 65 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  equires a read-l
33990 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61  ock on page 1 (a
339a0 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68  nd hence.  ** th
339b0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
339c0 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74  table. We grab t
339d0 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c  his lock regardl
339e0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
339f0 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53  r.  ** not the S
33a00 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
33a10 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
33a20 74 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  t (the table roo
33a30 74 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a  ted at page.  **
33a40 20 31 20 69 73 20 74 72 65 61 74 65 64 20 61 73   1 is treated as
33a50 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20   a special case 
33a60 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  by queryTableLoc
33a70 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c  k() and lockTabl
33a80 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  e())..  */.  rc 
33a90 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
33aa0 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b  (p, 1, READ_LOCK
33ab0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
33ac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
33ad0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
33ae0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  p);.    return r
33af0 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
33b00 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
33b10 3d 31 35 20 29 3b 0a 20 20 69 66 28 20 70 42 74  =15 );.  if( pBt
33b20 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20  ->pPage1 ){.    
33b30 2f 2a 20 54 68 65 20 62 2d 74 72 65 65 20 69 73  /* The b-tree is
33b40 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 69 6e 67   already holding
33b50 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
33b60 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  page 1 of the da
33b70 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
33b80 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  le. In this case
33b90 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6d 65   the required me
33ba0 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 63 61  ta-data value ca
33bb0 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
33bc0 6c 79 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ly.    ** from t
33bd0 68 65 20 70 61 67 65 20 64 61 74 61 20 6f 66 20  he page data of 
33be0 74 68 69 73 20 72 65 66 65 72 65 6e 63 65 2e 20  this reference. 
33bf0 54 68 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79  This is slightly
33c00 20 66 61 73 74 65 72 20 74 68 61 6e 0a 20 20 20   faster than.   
33c10 20 2a 2a 20 72 65 71 75 65 73 74 69 6e 67 20 61   ** requesting a
33c20 20 6e 65 77 20 72 65 66 65 72 65 6e 63 65 20 66   new reference f
33c30 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
33c40 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  yer..    */.    
33c50 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  pP1 = (unsigned 
33c60 63 68 61 72 20 2a 29 70 42 74 2d 3e 70 50 61 67  char *)pBt->pPag
33c70 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 7d 65 6c  e1->aData;.  }el
33c80 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62  se{.    /* The b
33c90 2d 74 72 65 65 20 64 6f 65 73 20 6e 6f 74 20 68  -tree does not h
33ca0 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ave a reference 
33cb0 74 6f 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  to page 1 of the
33cc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
33cd0 20 20 20 20 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e      ** Obtain on
33ce0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
33cf0 20 6c 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20   layer..    */. 
33d00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33d10 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
33d20 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65  ger, 1, &pDbPage
33d30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
33d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
33d50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
33d60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33d70 20 20 7d 0a 20 20 20 20 70 50 31 20 3d 20 28 75    }.    pP1 = (u
33d80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73  nsigned char *)s
33d90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
33da0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ta(pDbPage);.  }
33db0 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34  .  *pMeta = get4
33dc0 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69  byte(&pP1[36 + i
33dd0 64 78 2a 34 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66  dx*4]);..  /* If
33de0 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6e   the b-tree is n
33df0 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  ot holding a ref
33e00 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
33e10 2c 20 74 68 65 6e 20 6f 6e 65 20 77 61 73 20 0a  , then one was .
33e20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66    ** requested f
33e30 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
33e40 79 65 72 20 69 6e 20 74 68 65 20 61 62 6f 76 65  yer in the above
33e50 20 62 6c 6f 63 6b 2e 20 52 65 6c 65 61 73 65 20   block. Release 
33e60 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  it now..  */.  i
33e70 66 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  f( !pBt->pPage1 
33e80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
33e90 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
33ea0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
33eb0 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20  autovacuumed is 
33ec0 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73  disabled in this
33ed0 20 62 75 69 6c 64 20 62 75 74 20 77 65 20 61 72   build but we ar
33ee0 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a  e trying to .  *
33ef0 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f  * access an auto
33f00 76 61 63 75 75 6d 65 64 20 64 61 74 61 62 61 73  vacuumed databas
33f10 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65  e, then make the
33f20 20 64 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e   database readon
33f30 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ly. .  */.#ifdef
33f40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33f50 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64  OVACUUM.  if( id
33f60 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30  x==4 && *pMeta>0
33f70 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   ) pBt->readOnly
33f80 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 1;.#endif..  
33f90 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65 61 64  /* Grab the read
33fa0 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e  -lock on page 1.
33fb0 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54   */.  rc = lockT
33fc0 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41 44 5f  able(p, 1, READ_
33fd0 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  LOCK);.  sqlite3
33fe0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
33ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34000 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d  *.** Write meta-
34010 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b  information back
34020 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
34030 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a  se.  Meta[0] is.
34040 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  ** read-only and
34050 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74   may not be writ
34060 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ten..*/.int sqli
34070 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
34080 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ta(Btree *p, int
34090 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29   idx, u32 iMeta)
340a0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
340b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
340c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31  signed char *pP1
340d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
340e0 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20  sert( idx>=1 && 
340f0 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c  idx<=15 );.  sql
34100 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
34110 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
34120 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69  ->db;.  if( p->i
34130 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
34140 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ITE ){.    rc = 
34150 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
34160 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
34170 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
34180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
34190 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
341a0 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 31 20 3d  !=0 );.    pP1 =
341b0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
341c0 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ata;.    rc = sq
341d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
341e0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
341f0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
34200 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34210 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
34220 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c  pP1[36 + idx*4],
34230 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e 64 65 66   iMeta);.#ifndef
34240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
34250 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
34260 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20 20  ( idx==7 ){.    
34270 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
34280 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69  >autoVacuum || i
34290 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Meta==0 );.     
342a0 20 20 20 61 73 73 65 72 74 28 20 69 4d 65 74 61     assert( iMeta
342b0 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20  ==0 || iMeta==1 
342c0 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
342d0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 75 38  incrVacuum = (u8
342e0 29 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a  )iMeta;.      }.
342f0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
34300 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
34310 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
34320 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
34330 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62  eturn the flag b
34340 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e  yte at the begin
34350 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65  ning of the page
34360 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
34370 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
34380 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
34390 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
343a0 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  eFlags(BtCursor 
343b0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
343c0 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55  O: What about CU
343d0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
343e0 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79   state? Probably
343f0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20   need to call.  
34400 2a 2a 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ** restoreCursor
34410 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e  Position() here.
34420 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  .  */.  MemPage 
34430 2a 70 50 61 67 65 3b 0a 20 20 72 65 73 74 6f 72  *pPage;.  restor
34440 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
34450 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d  pCur);.  pPage =
34460 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
34470 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
34480 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
34490 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
344a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
344b0 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74 20  >pBt==pCur->pBt 
344c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
344d0 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e ? pPage->aData
344e0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
344f0 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  t] : 0;.}.../*.*
34500 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
34510 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
34520 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68 69  th a BTree.  Thi
34530 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
34540 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
34550 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
34560 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73  nly..*/.Pager *s
34570 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
34580 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
34590 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61  turn p->pBt->pPa
345a0 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ger;.}..#ifndef 
345b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
345c0 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
345d0 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61  * Append a messa
345e0 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ge to the error 
345f0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
34600 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
34610 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20  heckAppendMsg(. 
34620 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
34630 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d  heck,.  char *zM
34640 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sg1,.  const cha
34650 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e  r *zFormat,.  ..
34660 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
34670 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b  p;.  if( !pCheck
34680 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e  ->mxErr ) return
34690 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72  ;.  pCheck->mxEr
346a0 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e  r--;.  pCheck->n
346b0 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72  Err++;.  va_star
346c0 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
346d0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72    if( pCheck->er
346e0 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20 20  rMsg.nChar ){.  
346f0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
34700 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d  mAppend(&pCheck-
34710 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20 31  >errMsg, "\n", 1
34720 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 73  );.  }.  if( zMs
34730 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g1 ){.    sqlite
34740 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
34750 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
34760 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20 7d   zMsg1, -1);.  }
34770 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e  .  sqlite3VXPrin
34780 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d  tf(&pCheck->errM
34790 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c 20  sg, 1, zFormat, 
347a0 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
347b0 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d  );.  if( pCheck-
347c0 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46 61  >errMsg.mallocFa
347d0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 43 68 65  iled ){.    pChe
347e0 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ck->mallocFailed
347f0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 1;.  }.}.#end
34800 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
34810 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
34820 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
34830 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
34840 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
34850 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65 66  Add 1 to the ref
34860 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
34870 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66   page iPage.  If
34880 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
34890 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ond.** reference
348a0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64   to the page, ad
348b0 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
348c0 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45  ge to pCheck->zE
348d0 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e  rrMsg..** Return
348e0 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20   1 if there are 
348f0 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72  2 ore more refer
34900 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
34910 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66  e and 0 if.** if
34920 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
34930 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  st reference to 
34940 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
34950 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20  Also check that 
34960 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
34970 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f  is in bounds..*/
34980 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
34990 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b  kRef(IntegrityCk
349a0 20 2a 70 43 68 65 63 6b 2c 20 50 67 6e 6f 20 69   *pCheck, Pgno i
349b0 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e  Page, char *zCon
349c0 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61  text){.  if( iPa
349d0 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ge==0 ) return 1
349e0 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43  ;.  if( iPage>pC
349f0 68 65 63 6b 2d 3e 6e 50 61 67 65 20 29 7b 0a 20  heck->nPage ){. 
34a00 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
34a10 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
34a20 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67  xt, "invalid pag
34a30 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50  e number %d", iP
34a40 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
34a50 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   1;.  }.  if( pC
34a60 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67  heck->anRef[iPag
34a70 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65  e]==1 ){.    che
34a80 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
34a90 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32  ck, zContext, "2
34aa0 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  nd reference to 
34ab0 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
34ac0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
34ad0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70    }.  return  (p
34ae0 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
34af0 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66  ge]++)>1;.}..#if
34b00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34b10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
34b20 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
34b30 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
34b40 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61  inter-map for pa
34b50 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74  ge iChild maps t
34b60 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65  o .** page iPare
34b70 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65  nt, pointer type
34b80 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74   ptrType. If not
34b90 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f  , append an erro
34ba0 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20  r message.** to 
34bb0 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  pCheck..*/.stati
34bc0 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d  c void checkPtrm
34bd0 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ap(.  IntegrityC
34be0 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20  k *pCheck,   /* 
34bf0 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  Integrity check 
34c00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e  context */.  Pgn
34c10 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20  o iChild,       
34c20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67      /* Child pag
34c30 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38  e number */.  u8
34c40 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
34c50 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
34c60 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70   pointer map typ
34c70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72  e */.  Pgno iPar
34c80 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ent,          /*
34c90 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65   Expected pointe
34ca0 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67  r map parent pag
34cb0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
34cc0 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
34cd0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
34ce0 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65  description (use
34cf0 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29  d for error msg)
34d00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
34d10 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79 70  .  u8 ePtrmapTyp
34d20 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  e;.  Pgno iPtrma
34d30 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d  pParent;..  rc =
34d40 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65 63   ptrmapGet(pChec
34d50 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20  k->pBt, iChild, 
34d60 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69  &ePtrmapType, &i
34d70 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20  PtrmapParent);. 
34d80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34d90 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
34da0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
34db0 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46   pCheck->mallocF
34dc0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 63  ailed = 1;.    c
34dd0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
34de0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
34df0 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20  "Failed to read 
34e00 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20  ptrmap key=%d", 
34e10 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74  iChild);.    ret
34e20 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
34e30 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79  ePtrmapType!=eTy
34e40 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72  pe || iPtrmapPar
34e50 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a  ent!=iParent ){.
34e60 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
34e70 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
34e80 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64  ext, .      "Bad
34e90 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b   ptr map entry k
34ea0 65 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28  ey=%d expected=(
34eb0 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25  %d,%d) got=(%d,%
34ec0 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69  d)", .      iChi
34ed0 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65  ld, eType, iPare
34ee0 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c  nt, ePtrmapType,
34ef0 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b   iPtrmapParent);
34f00 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
34f10 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69  *.** Check the i
34f20 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20  ntegrity of the 
34f30 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61  freelist or of a
34f40 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
34f50 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20  list..** Verify 
34f60 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
34f70 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
34f80 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74  list is N..*/.st
34f90 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c  atic void checkL
34fa0 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79  ist(.  Integrity
34fb0 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20  Ck *pCheck,  /* 
34fc0 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 69  Integrity checki
34fd0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
34fe0 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20  int isFreeList, 
34ff0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
35000 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46  r a freelist.  F
35010 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f  alse for overflo
35020 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20  w page list */. 
35030 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20   int iPage,     
35040 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
35050 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74 20  umber for first 
35060 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
35070 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
35080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
35090 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
350a0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  f pages in the l
350b0 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ist */.  char *z
350c0 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f  Context        /
350d0 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72  * Context for er
350e0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
350f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
35100 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a  t expected = N;.
35110 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69    int iFirst = i
35120 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e  Page;.  while( N
35130 2d 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b  -- > 0 && pCheck
35140 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44  ->mxErr ){.    D
35150 62 50 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65  bPage *pOvflPage
35160 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
35170 68 61 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a  har *pOvflData;.
35180 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 31 20      if( iPage<1 
35190 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
351a0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
351b0 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
351c0 20 20 20 22 25 64 20 6f 66 20 25 64 20 70 61 67     "%d of %d pag
351d0 65 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  es missing from 
351e0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74  overflow list st
351f0 61 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20  arting at %d",. 
35200 20 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78           N+1, ex
35210 70 65 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b  pected, iFirst);
35220 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
35230 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63    }.    if( chec
35240 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61  kRef(pCheck, iPa
35250 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20  ge, zContext) ) 
35260 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73  break;.    if( s
35270 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
35280 43 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28  Check->pPager, (
35290 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76  Pgno)iPage, &pOv
352a0 66 6c 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  flPage) ){.     
352b0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
352c0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
352d0 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74  , "failed to get
352e0 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
352f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
35300 20 20 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44      }.    pOvflD
35310 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
35320 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
35330 67 65 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c  gerGetData(pOvfl
35340 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Page);.    if( i
35350 73 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20  sFreeList ){.   
35360 20 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62     int n = get4b
35370 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34  yte(&pOvflData[4
35380 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
35390 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
353a0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  UM.      if( pCh
353b0 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
353c0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
353d0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
353e0 63 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  ck, iPage, PTRMA
353f0 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a  P_FREEPAGE, 0, z
35400 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
35410 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
35420 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74  f( n>pCheck->pBt
35430 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32  ->usableSize/4-2
35440 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
35450 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
35460 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  k, zContext,.   
35470 20 20 20 20 20 20 20 20 22 66 72 65 65 6c 69 73          "freelis
35480 74 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f  t leaf count too
35490 20 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22   big on page %d"
354a0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
354b0 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c    N--;.      }el
354c0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
354d0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
354e0 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
354f0 46 72 65 65 50 61 67 65 20 3d 20 67 65 74 34 62  FreePage = get4b
35500 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38  yte(&pOvflData[8
35510 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20  +i*4]);.#ifndef 
35520 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
35530 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20  VACUUM.         
35540 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
35550 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
35560 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
35570 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
35580 69 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41  iFreePage, PTRMA
35590 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a  P_FREEPAGE, 0, z
355a0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
355b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
355c0 20 20 20 20 20 20 20 63 68 65 63 6b 52 65 66 28         checkRef(
355d0 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67  pCheck, iFreePag
355e0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
355f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35600 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  N -= n;.      }.
35610 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
35620 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
35630 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20  CUUM.    else{. 
35640 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
35650 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
35660 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e  s auto-vacuum an
35670 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74  d iPage is not t
35680 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a  he last.      **
35690 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76   page in this ov
356a0 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65  erflow list, che
356b0 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e  ck that the poin
356c0 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
356d0 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  r.      ** the f
356e0 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61  ollowing page ma
356f0 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20  tches iPage..   
35700 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
35710 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74  pCheck->pBt->aut
35720 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29  oVacuum && N>0 )
35730 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67 65  {.        i = ge
35740 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61  t4byte(pOvflData
35750 29 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  );.        check
35760 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
35770 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
35780 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  W2, iPage, zCont
35790 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ext);.      }.  
357a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
357b0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
357c0 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20  pOvflData);.    
357d0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
357e0 66 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20  f(pOvflPage);.  
357f0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
35800 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
35810 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
35820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35830 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
35840 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f  K./*.** Do vario
35850 75 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73  us sanity checks
35860 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67   on a single pag
35870 65 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65  e of a tree.  Re
35880 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65  turn.** the tree
35890 20 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61   depth.  Root pa
358a0 67 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50  ges return 0.  P
358b0 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70  arents of root p
358c0 61 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31  ages.** return 1
358d0 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a  , and so forth..
358e0 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65  ** .** These che
358f0 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a  cks are done:.**
35900 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b  .**      1.  Mak
35910 65 20 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c  e sure that cell
35920 73 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73  s and freeblocks
35930 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a   do not overlap.
35940 2a 2a 20 20 20 20 20 20 20 20 20 20 62 75 74 20  **          but 
35950 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c  combine to compl
35960 65 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20  etely cover the 
35970 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e  page..**  NO  2.
35980 20 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c    Make sure cell
35990 20 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64   keys are in ord
359a0 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20  er..**  NO  3.  
359b0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79  Make sure no key
359c0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
359d0 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72   equal to zLower
359e0 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34  Bound..**  NO  4
359f0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  .  Make sure no 
35a00 6b 65 79 20 69 73 20 67 72 65 61 74 65 72 20 74  key is greater t
35a10 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
35a20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20  zUpperBound..** 
35a30 20 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74       5.  Check t
35a40 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
35a50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
35a60 2a 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63 75  **      6.  Recu
35a70 72 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65  rsively call che
35a80 63 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c  ckTreePage on al
35a90 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20  l children..**  
35aa0 20 20 20 20 37 2e 20 20 56 65 72 69 66 79 20 74      7.  Verify t
35ab0 68 61 74 20 74 68 65 20 64 65 70 74 68 20 6f 66  hat the depth of
35ac0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73   all children is
35ad0 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20   the same..**   
35ae0 20 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65     8.  Make sure
35af0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 61 74   this page is at
35b00 20 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20   least 33% full 
35b10 6f 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a  or else it is.**
35b20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 6f            the ro
35b30 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a  ot of the tree..
35b40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
35b50 65 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49  eckTreePage(.  I
35b60 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
35b70 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20  ck,  /* Context 
35b80 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63  for the sanity c
35b90 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50  heck */.  int iP
35ba0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
35bb0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
35bc0 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 63 68  f the page to ch
35bd0 65 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  eck */.  char *z
35be0 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f  ParentContext  /
35bf0 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74  * Parent context
35c00 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
35c10 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69   *pPage;.  int i
35c20 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c  , rc, depth, d2,
35c30 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e   pgno, cnt;.  in
35c40 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74  t hdr, cellStart
35c50 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
35c60 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53   u8 *data;.  BtS
35c70 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e  hared *pBt;.  in
35c80 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
35c90 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30  char zContext[10
35ca0 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 20  0];.  char *hit 
35cb0 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  = 0;..  sqlite3_
35cc0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
35cd0 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74  zContext), zCont
35ce0 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20 22  ext, "Page %d: "
35cf0 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20  , iPage);..  /* 
35d00 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  Check that the p
35d10 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a  age exists.  */.
35d20 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e    pBt = pCheck->
35d30 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  pBt;.  usableSiz
35d40 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
35d50 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67 65  ize;.  if( iPage
35d60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
35d70 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70    if( checkRef(p
35d80 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50  Check, iPage, zP
35d90 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29 20  arentContext) ) 
35da0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
35db0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
35dc0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28  eeGetPage(pBt, (
35dd0 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50 61  Pgno)iPage, &pPa
35de0 67 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20  ge, 0))!=0 ){.  
35df0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35e00 5f 4e 4f 4d 45 4d 20 29 20 70 43 68 65 63 6b 2d  _NOMEM ) pCheck-
35e10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
35e20 31 3b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  1;.    checkAppe
35e30 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
35e40 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22  ontext,.       "
35e50 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68  unable to get th
35e60 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f  e page. error co
35e70 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de=%d", rc);.   
35e80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
35e90 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
35ea0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
35eb0 70 50 61 67 65 29 29 21 3d 30 20 29 7b 0a 20 20  pPage))!=0 ){.  
35ec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35ed0 5f 4e 4f 4d 45 4d 20 29 20 70 43 68 65 63 6b 2d  _NOMEM ) pCheck-
35ee0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
35ef0 31 3b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  1;.    checkAppe
35f00 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
35f10 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20  ontext, .       
35f20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71 6c              "sql
35f30 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
35f40 65 28 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f  e() returns erro
35f50 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b  r code %d", rc);
35f60 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
35f70 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
35f80 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
35f90 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74   Check out all t
35fa0 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  he cells..  */. 
35fb0 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f   depth = 0;.  fo
35fc0 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
35fd0 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d  nCell && pCheck-
35fe0 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20  >mxErr; i++){.  
35ff0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
36000 20 75 33 32 20 73 7a 3b 0a 20 20 20 20 43 65 6c   u32 sz;.    Cel
36010 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20  lInfo info;..   
36020 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61   /* Check payloa
36030 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  d overflow pages
36040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
36050 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
36060 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a  eof(zContext), z
36070 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
36080 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65 20 70        "On tree p
36090 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20  age %d cell %d: 
360a0 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20  ", iPage, i);.  
360b0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
360c0 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20  ll(pPage,i);.   
360d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
360e0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
360f0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
36100 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44      sz = info.nD
36110 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ata;.    if( !pP
36120 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a  age->intKey ) sz
36130 20 2b 3d 20 28 69 6e 74 29 69 6e 66 6f 2e 6e 4b   += (int)info.nK
36140 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ey;.    assert( 
36150 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  sz==info.nPayloa
36160 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e  d );.    if( sz>
36170 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
36180 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
36190 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63   (sz - info.nLoc
361a0 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20  al + usableSize 
361b0 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65  - 5)/(usableSize
361c0 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e   - 4);.      Pgn
361d0 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74  o pgnoOvfl = get
361e0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
361f0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23  o.iOverflow]);.#
36200 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36210 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
36220 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
36230 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
36240 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
36250 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c  Check, pgnoOvfl,
36260 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
36270 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  1, iPage, zConte
36280 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
36290 64 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c  dif.      checkL
362a0 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70  ist(pCheck, 0, p
362b0 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20  gnoOvfl, nPage, 
362c0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  zContext);.    }
362d0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73  ..    /* Check s
362e0 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68  anity of left ch
362f0 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ild page..    */
36300 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
36310 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
36320 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
36330 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
36340 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
36350 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
36360 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
36370 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
36380 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
36390 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
363a0 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  E, iPage, zConte
363b0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
363c0 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63  dif.      d2 = c
363d0 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68  heckTreePage(pCh
363e0 65 63 6b 2c 20 70 67 6e 6f 2c 20 7a 43 6f 6e 74  eck, pgno, zCont
363f0 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
36400 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74 68  i>0 && d2!=depth
36410 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
36420 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
36430 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68  k, zContext, "Ch
36440 69 6c 64 20 70 61 67 65 20 64 65 70 74 68 20 64  ild page depth d
36450 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20  iffers");.      
36460 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d 20  }.      depth = 
36470 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  d2;.    }.  }.  
36480 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
36490 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
364a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
364b0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
364c0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
364d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
364e0 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
364f0 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20  ), zContext, .  
36500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36510 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61     "On page %d a
36520 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22  t right child: "
36530 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65  , iPage);.#ifnde
36540 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
36550 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
36560 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
36570 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50   ){.      checkP
36580 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
36590 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
365a0 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  , iPage, 0);.   
365b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
365c0 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65  eckTreePage(pChe
365d0 63 6b 2c 20 70 67 6e 6f 2c 20 7a 43 6f 6e 74 65  ck, pgno, zConte
365e0 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20  xt);.  }. .  /* 
365f0 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65  Check for comple
36600 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74  te coverage of t
36610 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64  he page.  */.  d
36620 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
36630 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
36640 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
36650 68 69 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  hit = sqlite3Pag
36660 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
36670 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  geSize );.  if( 
36680 68 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  hit==0 ){.    pC
36690 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  heck->mallocFail
366a0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
366b0 0a 20 20 20 20 75 31 36 20 63 6f 6e 74 65 6e 74  .    u16 content
366c0 4f 66 66 73 65 74 20 3d 20 67 65 74 32 62 79 74  Offset = get2byt
366d0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
366e0 0a 20 20 20 20 69 66 20 28 63 6f 6e 74 65 6e 74  .    if (content
366f0 4f 66 66 73 65 74 20 3e 20 75 73 61 62 6c 65 53  Offset > usableS
36700 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 63 68 65  ize) {.      che
36710 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
36720 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ck, 0, .        
36730 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f               "Co
36740 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65  rruption detecte
36750 64 20 69 6e 20 68 65 61 64 65 72 20 6f 6e 20 70  d in header on p
36760 61 67 65 20 25 64 22 2c 69 50 61 67 65 2c 30 29  age %d",iPage,0)
36770 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 68 65  ;.      goto che
36780 63 6b 5f 70 61 67 65 5f 61 62 6f 72 74 3b 0a 20  ck_page_abort;. 
36790 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
367a0 68 69 74 2b 63 6f 6e 74 65 6e 74 4f 66 66 73 65  hit+contentOffse
367b0 74 2c 20 30 2c 20 75 73 61 62 6c 65 53 69 7a 65  t, 0, usableSize
367c0 2d 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 29 3b  -contentOffset);
367d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c  .    memset(hit,
367e0 20 31 2c 20 63 6f 6e 74 65 6e 74 4f 66 66 73 65   1, contentOffse
367f0 74 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  t);.    nCell = 
36800 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
36810 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
36820 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
36830 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
36840 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
36850 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
36860 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
36870 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
36880 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
36890 20 20 20 75 31 36 20 73 69 7a 65 20 3d 20 31 30     u16 size = 10
368a0 32 34 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  24;.      int j;
368b0 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 3d 75  .      if( pc<=u
368c0 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
368d0 20 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c       size = cell
368e0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
368f0 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
36900 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 63   }.      if( (pc
36910 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
36920 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a  Size || pc<0 ){.
36930 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
36940 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
36950 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
36960 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
36970 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
36980 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
36990 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
369a0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
369b0 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  j=pc+size-1; j>=
369c0 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  pc; j--) hit[j]+
369d0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
369e0 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20  .    for(cnt=0, 
369f0 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  i=get2byte(&data
36a00 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26  [hdr+1]); i>0 &&
36a10 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26   i<usableSize &&
36a20 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20   cnt<10000; .   
36a30 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a          cnt++){.
36a40 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
36a50 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
36a60 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i+2]);.      int
36a70 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   j;.      if( (i
36a80 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
36a90 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20  Size || i<0 ){. 
36aa0 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
36ab0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
36ac0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22    .            "
36ad0 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
36ae0 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
36af0 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
36b00 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
36b10 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
36b20 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69  j=i+size-1; j>=i
36b30 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
36b40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36b50 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
36b60 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  a[i]);.    }.   
36b70 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c   for(i=cnt=0; i<
36b80 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29  usableSize; i++)
36b90 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b  {.      if( hit[
36ba0 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
36bb0 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65   cnt++;.      }e
36bc0 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31  lse if( hit[i]>1
36bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
36be0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
36bf0 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  k, 0,.          
36c00 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66  "Multiple uses f
36c10 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61  or byte %d of pa
36c20 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65  ge %d", i, iPage
36c30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
36c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36c50 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74      if( cnt!=dat
36c60 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20  a[hdr+7] ){.    
36c70 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
36c80 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
36c90 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74         "Fragment
36ca0 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62  ed space is %d b
36cb0 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20  yte reported as 
36cc0 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a  %d on page %d",.
36cd0 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64            cnt, d
36ce0 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67  ata[hdr+7], iPag
36cf0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 63 68  e);.    }.  }.ch
36d00 65 63 6b 5f 70 61 67 65 5f 61 62 6f 72 74 3a 0a  eck_page_abort:.
36d10 20 20 69 66 20 28 68 69 74 29 20 73 71 6c 69 74    if (hit) sqlit
36d20 65 33 50 61 67 65 46 72 65 65 28 68 69 74 29 3b  e3PageFree(hit);
36d30 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ..  releasePage(
36d40 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
36d50 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64   depth+1;.}.#end
36d60 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
36d70 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
36d80 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
36d90 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
36da0 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
36db0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
36dc0 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65  s a complete che
36dd0 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ck of the given 
36de0 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f  BTree file.  aRo
36df0 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72  ot[] is.** an ar
36e00 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d  ray of pages num
36e10 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20 70  bers were each p
36e20 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68  age number is th
36e30 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a  e root page of.*
36e40 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f  * a table.  nRoo
36e50 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
36e60 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52  of entries in aR
36e70 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  oot..**.** Write
36e80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
36e90 72 72 6f 72 20 73 65 65 6e 20 69 6e 20 2a 70 6e  rror seen in *pn
36ea0 45 72 72 2e 20 20 45 78 63 65 70 74 20 66 6f 72  Err.  Except for
36eb0 20 73 6f 6d 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20   some memory.** 
36ec0 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
36ed0 73 2c 20 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  s,  an error mes
36ee0 73 61 67 65 20 68 65 6c 64 20 69 6e 20 6d 65 6d  sage held in mem
36ef0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
36f00 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 69 73 20 72  m.** malloc is r
36f10 65 74 75 72 6e 65 64 20 69 66 20 2a 70 6e 45 72  eturned if *pnEr
36f20 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  r is non-zero.  
36f30 49 66 20 2a 70 6e 45 72 72 3d 3d 30 20 74 68 65  If *pnErr==0 the
36f40 6e 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 72 65 74  n NULL is.** ret
36f50 75 72 6e 65 64 2e 20 20 49 66 20 61 20 6d 65 6d  urned.  If a mem
36f60 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
36f70 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
36f80 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
36f90 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  /.char *sqlite3B
36fa0 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65  treeIntegrityChe
36fb0 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  ck(.  Btree *p, 
36fc0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
36fd0 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a   to be checked *
36fe0 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20  /.  int *aRoot, 
36ff0 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66    /* An array of
37000 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62   root pages numb
37010 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75  ers for individu
37020 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e  al trees */.  in
37030 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e  t nRoot,    /* N
37040 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
37050 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20   in aRoot[] */. 
37060 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f   int mxErr,    /
37070 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67  * Stop reporting
37080 20 65 72 72 6f 72 73 20 61 66 74 65 72 20 74 68   errors after th
37090 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74  is many */.  int
370a0 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72   *pnErr    /* Wr
370b0 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  ite number of er
370c0 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69  rors seen to thi
370d0 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b  s variable */.){
370e0 0a 20 20 50 67 6e 6f 20 69 3b 0a 20 20 69 6e 74  .  Pgno i;.  int
370f0 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69   nRef;.  Integri
37100 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42  tyCk sCheck;.  B
37110 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
37120 2d 3e 70 42 74 3b 0a 20 20 63 68 61 72 20 7a 45  ->pBt;.  char zE
37130 72 72 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69  rr[100];..  sqli
37140 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
37150 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
37160 3e 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20 73 71  >db;.  nRef = sq
37170 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
37180 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
37190 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65  .  if( lockBtree
371a0 57 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51  WithRetry(p)!=SQ
371b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
371c0 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 73  pnErr = 1;.    s
371d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
371e0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
371f0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
37200 30 2c 20 22 63 61 6e 6e 6f 74 20 61 63 71 75 69  0, "cannot acqui
37210 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  re a read lock o
37220 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 22 29  n the database")
37230 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70  ;.  }.  sCheck.p
37240 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65  Bt = pBt;.  sChe
37250 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d  ck.pPager = pBt-
37260 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63  >pPager;.  sChec
37270 6b 2e 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50  k.nPage = pagerP
37280 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e  agecount(sCheck.
37290 70 42 74 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d  pBt);.  sCheck.m
372a0 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20  xErr = mxErr;.  
372b0 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b  sCheck.nErr = 0;
372c0 0a 20 20 73 43 68 65 63 6b 2e 6d 61 6c 6c 6f 63  .  sCheck.malloc
372d0 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 2a 70  Failed = 0;.  *p
372e0 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  nErr = 0;.  if( 
372f0 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20  sCheck.nPage==0 
37300 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  ){.    unlockBtr
37310 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
37320 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
37330 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
37340 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
37350 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71  Check.anRef = sq
37360 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 73 43  lite3Malloc( (sC
37370 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
37380 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
37390 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21  f[0]) );.  if( !
373a0 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a  sCheck.anRef ){.
373b0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
373c0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
373d0 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20    *pnErr = 1;.  
373e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
373f0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
37400 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
37410 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e  i=0; i<=sCheck.n
37420 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65  Page; i++){ sChe
37430 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b  ck.anRef[i] = 0;
37440 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47   }.  i = PENDING
37450 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b  _BYTE_PAGE(pBt);
37460 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b  .  if( i<=sCheck
37470 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43  .nPage ){.    sC
37480 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20  heck.anRef[i] = 
37490 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
374a0 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73 43  StrAccumInit(&sC
374b0 68 65 63 6b 2e 65 72 72 4d 73 67 2c 20 7a 45 72  heck.errMsg, zEr
374c0 72 2c 20 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c  r, sizeof(zErr),
374d0 20 32 30 30 30 30 29 3b 0a 0a 20 20 2f 2a 20 43   20000);..  /* C
374e0 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
374f0 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ty of the freeli
37500 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c  st.  */.  checkL
37510 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20  ist(&sCheck, 1, 
37520 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
37530 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
37540 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ),.            g
37550 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
37560 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
37570 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74  , "Main freelist
37580 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  : ");..  /* Chec
37590 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  k all the tables
375a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
375b0 3b 20 28 69 6e 74 29 69 3c 6e 52 6f 6f 74 20 26  ; (int)i<nRoot &
375c0 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20  & sCheck.mxErr; 
375d0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52  i++){.    if( aR
375e0 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  oot[i]==0 ) cont
375f0 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  inue;.#ifndef SQ
37600 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
37610 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
37620 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
37630 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20  aRoot[i]>1 ){.  
37640 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
37650 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69  &sCheck, aRoot[i
37660 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  ], PTRMAP_ROOTPA
37670 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  GE, 0, 0);.    }
37680 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63  .#endif.    chec
37690 6b 54 72 65 65 50 61 67 65 28 26 73 43 68 65 63  kTreePage(&sChec
376a0 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 22 4c 69  k, aRoot[i], "Li
376b0 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73  st of tree roots
376c0 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  : ");.  }..  /* 
376d0 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20  Make sure every 
376e0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
376f0 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20   is referenced. 
37700 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
37710 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26  <=sCheck.nPage &
37720 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20  & sCheck.mxErr; 
37730 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  i++){.#ifdef SQL
37740 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
37750 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65  UUM.    if( sChe
37760 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29  ck.anRef[i]==0 )
37770 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
37780 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
37790 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e  0, "Page %d is n
377a0 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a  ever used", i);.
377b0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
377c0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
377d0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
377e0 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75  -vacuum, make su
377f0 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e  re no tables con
37800 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65  tain.    ** refe
37810 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65  rences to pointe
37820 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20  r-map pages..   
37830 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65   */.    if( sChe
37840 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26  ck.anRef[i]==0 &
37850 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41  & .       (PTRMA
37860 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29  P_PAGENO(pBt, i)
37870 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74  !=i || !pBt->aut
37880 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
37890 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
378a0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
378b0 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
378c0 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
378d0 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
378e0 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20  nRef[i]!=0 && . 
378f0 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
37900 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20  GENO(pBt, i)==i 
37910 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  && pBt->autoVacu
37920 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
37930 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
37940 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72  eck, 0, "Pointer
37950 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73 20   map page %d is 
37960 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b  referenced", i);
37970 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
37980 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
37990 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20  e this analysis 
379a0 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e  did not leave an
379b0 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a  y unref() pages.
379c0 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72    */.  unlockBtr
379d0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
379e0 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73  .  if( nRef != s
379f0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
37a00 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
37a10 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
37a20 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
37a30 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74  0, .      "Outst
37a40 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e  anding page coun
37a50 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74  t goes from %d t
37a60 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68 69 73  o %d during this
37a70 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20   analysis",.    
37a80 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50    nRef, sqlite3P
37a90 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
37aa0 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  ->pPager).    );
37ab0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
37ac0 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20    up and report 
37ad0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73  errors..  */.  s
37ae0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
37af0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
37b00 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  ree(sCheck.anRef
37b10 29 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e  );.  if( sCheck.
37b20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
37b30 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
37b40 63 75 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b  cumReset(&sCheck
37b50 2e 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 2a 70  .errMsg);.    *p
37b60 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45  nErr = sCheck.nE
37b70 72 72 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr+1;.    return
37b80 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 45 72 72   0;.  }.  *pnErr
37b90 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a   = sCheck.nErr;.
37ba0 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 45 72    if( sCheck.nEr
37bb0 72 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 53 74  r==0 ) sqlite3St
37bc0 72 41 63 63 75 6d 52 65 73 65 74 28 26 73 43 68  rAccumReset(&sCh
37bd0 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 20 20 72  eck.errMsg);.  r
37be0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
37bf0 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73 43 68  AccumFinish(&sCh
37c00 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 7d 0a 23  eck.errMsg);.}.#
37c10 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
37c20 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
37c30 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  HECK */../*.** R
37c40 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
37c50 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75  athname of the u
37c60 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
37c70 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
37c80 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e 61 6d  he pager filenam
37c90 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61  e is invariant a
37ca0 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61  s long as the pa
37cb0 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73  ger is.** open s
37cc0 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  o it is safe to 
37cd0 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74  access without t
37ce0 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65  he BtShared mute
37cf0 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  x..*/.const char
37d00 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
37d10 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20  tFilename(Btree 
37d20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
37d30 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
37d40 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
37d50 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
37d60 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
37d70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
37d80 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  rn the pathname 
37d90 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
37da0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
37db0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37dc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
37dd0 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65  r directory name
37de0 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73   is invariant as
37df0 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67   long as the pag
37e00 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f  er is.** open so
37e10 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61   it is safe to a
37e20 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68  ccess without th
37e30 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78  e BtShared mutex
37e40 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
37e50 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  *sqlite3BtreeGet
37e60 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  Dirname(Btree *p
37e70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
37e80 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
37e90 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
37ea0 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70  e3PagerDirname(p
37eb0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
37ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
37ed0 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  the pathname of 
37ee0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37ef0 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
37f00 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a  se. The return.*
37f10 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
37f20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73  routine is the s
37f30 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ame regardless o
37f40 66 20 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f  f whether the jo
37f50 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61  urnal file.** ha
37f60 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  s been created o
37f70 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r not..**.** The
37f80 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66   pager journal f
37f90 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72  ilename is invar
37fa0 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20  iant as long as 
37fb0 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20  the pager is.** 
37fc0 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61  open so it is sa
37fd0 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74  fe to access wit
37fe0 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65  hout the BtShare
37ff0 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73  d mutex..*/.cons
38000 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  t char *sqlite3B
38010 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
38020 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
38030 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
38040 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
38050 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67  eturn sqlite3Pag
38060 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d  erJournalname(p-
38070 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  >pBt->pPager);.}
38080 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
38090 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a  _OMIT_VACUUM./*.
380a0 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70  ** Copy the comp
380b0 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
380c0 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74  pBtFrom into pBt
380d0 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69  To.  A transacti
380e0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63  on.** must be ac
380f0 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69  tive for both fi
38100 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  les..**.** The s
38110 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 54 6f 20  ize of file pTo 
38120 6d 61 79 20 62 65 20 72 65 64 75 63 65 64 20 62  may be reduced b
38130 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
38140 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  ..** If anything
38150 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65   goes wrong, the
38160 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
38170 70 54 6f 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  pTo is rolled ba
38180 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ck. .**.** If su
38190 63 63 65 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74  ccessful, Commit
381a0 50 68 61 73 65 4f 6e 65 28 29 20 6d 61 79 20 62  PhaseOne() may b
381b0 65 20 63 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20  e called on pTo 
381c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
381d0 2e 20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  . .** The caller
381e0 20 73 68 6f 75 6c 64 20 66 69 6e 69 73 68 20 63   should finish c
381f0 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 74 72  ommitting the tr
38200 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f  ansaction on pTo
38210 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73   by calling.** s
38220 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
38230 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  t()..*/.static i
38240 6e 74 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65  nt btreeCopyFile
38250 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72  (Btree *pTo, Btr
38260 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e  ee *pFrom){.  in
38270 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
38280 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50  ;.  Pgno i;..  P
38290 67 6e 6f 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20  gno nFromPage;  
382a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
382b0 70 61 67 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a  pages in pFrom *
382c0 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65  /.  Pgno nToPage
382d0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
382e0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54  r of pages in pT
382f0 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77  o */.  Pgno nNew
38300 50 61 67 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75  Page;      /* Nu
38310 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
38320 20 70 54 6f 20 61 66 74 65 72 20 74 68 65 20 63   pTo after the c
38330 6f 70 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69  opy */..  Pgno i
38340 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  Skip;         /*
38350 20 50 65 6e 64 69 6e 67 20 62 79 74 65 20 70 61   Pending byte pa
38360 67 65 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69  ge in pTo */.  i
38370 6e 74 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20  nt nToPageSize; 
38380 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
38390 6f 66 20 70 54 6f 20 69 6e 20 62 79 74 65 73 20  of pTo in bytes 
383a0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61  */.  int nFromPa
383b0 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65  geSize;  /* Page
383c0 20 73 69 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69   size of pFrom i
383d0 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74  n bytes */..  Bt
383e0 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20  Shared *pBtTo = 
383f0 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68  pTo->pBt;.  BtSh
38400 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20  ared *pBtFrom = 
38410 70 46 72 6f 6d 2d 3e 70 42 74 3