/ Hex Artifact Content
Login

Artifact 7505a73bd9b7c36a816543c4a71437d8c2f7539a:


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 33 33 20 32 30 30 38 2f 31  c,v 1.533 2008/1
0190: 31 2f 31 32 20 30 38 3a 34 39 3a 35 32 20 64 61  1/12 08:49:52 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 30  ite3BtreeTrace=0
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  f../*.** Sometim
0430: 65 73 20 77 65 20 6e 65 65 64 20 61 20 73 6d 61  es we need a sma
0440: 6c 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 63 6f 64  ll amount of cod
0450: 65 20 73 75 63 68 20 61 73 20 61 20 76 61 72 69  e such as a vari
0460: 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
0470: 69 6f 6e 0a 2a 2a 20 74 6f 20 73 65 74 75 70 20  ion.** to setup 
0480: 66 6f 72 20 61 20 6c 61 74 65 72 20 61 73 73 65  for a later asse
0490: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e 20  rt() statement. 
04a0: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
04b0: 74 68 69 73 20 63 6f 64 65 20 74 6f 0a 2a 2a 20  this code to.** 
04c0: 61 70 70 65 61 72 20 77 68 65 6e 20 61 73 73 65  appear when asse
04d0: 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
04e0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
04f0: 20 6d 61 63 72 6f 20 69 73 20 74 68 65 72 65 66   macro is theref
0500: 6f 72 65 0a 2a 2a 20 75 73 65 64 20 74 6f 20 63  ore.** used to c
0510: 6f 6e 74 61 69 6e 20 74 68 61 74 20 73 65 74 75  ontain that setu
0520: 70 20 63 6f 64 65 2e 20 20 54 68 65 20 22 56 56  p code.  The "VV
0530: 41 22 20 61 63 72 6f 6e 79 6d 20 73 74 61 6e 64  A" acronym stand
0540: 73 20 66 6f 72 0a 2a 2a 20 22 56 65 72 69 66 69  s for.** "Verifi
0550: 63 61 74 69 6f 6e 2c 20 56 61 6c 69 64 61 74 69  cation, Validati
0560: 6f 6e 2c 20 61 6e 64 20 41 63 63 72 65 64 69 74  on, and Accredit
0570: 61 74 69 6f 6e 22 2e 20 20 49 6e 20 6f 74 68 65  ation".  In othe
0580: 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20  r words, the.** 
0590: 63 6f 64 65 20 77 69 74 68 69 6e 20 56 56 41 5f  code within VVA_
05a0: 4f 4e 4c 59 28 29 20 77 69 6c 6c 20 6f 6e 6c 79  ONLY() will only
05b0: 20 72 75 6e 20 64 75 72 69 6e 67 20 76 65 72 69   run during veri
05c0: 66 69 63 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  fication process
05d0: 65 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  es..*/.#ifndef N
05e0: 44 45 42 55 47 0a 23 20 64 65 66 69 6e 65 20 56  DEBUG.# define V
05f0: 56 41 5f 4f 4e 4c 59 28 58 29 20 20 58 0a 23 65  VA_ONLY(X)  X.#e
0600: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 56 56 41  lse.# define VVA
0610: 5f 4f 4e 4c 59 28 58 29 0a 23 65 6e 64 69 66 0a  _ONLY(X).#endif.
0620: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
0630: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0640: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0650: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0660: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0670: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0680: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0690: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
06a0: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
06b0: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
06c0: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
06d0: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
06e0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
06f0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
0700: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
0710: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
0720: 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ilds..*/.#ifdef 
0730: 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74 53 68  SQLITE_TEST.BtSh
0740: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0750: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0760: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6c  cheList = 0;.#el
0770: 73 65 0a 73 74 61 74 69 63 20 42 74 53 68 61 72  se.static BtShar
0780: 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44 20 73  ed *SQLITE_WSD s
0790: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
07a0: 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e 64 69  eList = 0;.#endi
07b0: 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  f.#endif /* SQLI
07c0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
07d0: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
07e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
07f0: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
0800: 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
0810: 65 20 74 68 65 20 73 68 61 72 65 64 20 70 61 67  e the shared pag
0820: 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20 66 65  er and schema fe
0830: 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atures..**.** Th
0840: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 6e  is routine has n
0850: 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78 69 73  o effect on exis
0860: 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  ting database co
0870: 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68  nnections..** Th
0880: 65 20 73 68 61 72 65 64 20 63 61 63 68 65 20 73  e shared cache s
0890: 65 74 74 69 6e 67 20 65 66 66 65 63 74 73 20 6f  etting effects o
08a0: 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c 6c 73  nly future calls
08b0: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f   to.** sqlite3_o
08c0: 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 6f  pen(), sqlite3_o
08d0: 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71 6c 69  pen16(), or sqli
08e0: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a  te3_open_v2()..*
08f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 6e  /.int sqlite3_en
0900: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
0910: 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b 0a 20  e(int enable){. 
0920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
0930: 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
0940: 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65  Enabled = enable
0950: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
0960: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
0970: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
0980: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
0990: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
09a0: 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c 20  adLocks(Btree*, 
09b0: 50 67 6e 6f 2c 20 42 74 43 75 72 73 6f 72 2a 2c  Pgno, BtCursor*,
09c0: 20 69 36 34 29 3b 0a 0a 0a 23 69 66 64 65 66 20   i64);...#ifdef 
09d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
09e0: 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20  ED_CACHE.  /*.  
09f0: 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 73  ** The functions
0a00: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
0a10: 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29 20 61  ), lockTable() a
0a20: 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  nd unlockAllTabl
0a30: 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  es().  ** manipu
0a40: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0a50: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0a60: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0a70: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0a80: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0a90: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0aa0: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0ab0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ac0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0ad0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0ae0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0af0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0b00: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0b10: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0b20: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0b30: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0b40: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0b50: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0b60: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0b70: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0b80: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0b90: 65 66 69 6e 65 20 71 75 65 72 79 54 61 62 6c 65  efine queryTable
0ba0: 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49  Lock(a,b,c) SQLI
0bb0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
0bc0: 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c 63 29  lockTable(a,b,c)
0bd0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
0be0: 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61  fine unlockAllTa
0bf0: 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66 0a 0a  bles(a).#endif..
0c00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0c10: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0c20: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
0c30: 73 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e  see if btree han
0c40: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
0c50: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
0c60: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
0c70: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
0c80: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
0c90: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
0ca0: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
0cb0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
0cc0: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
0cd0: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
0ce0: 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2c 20  g lockTable()), 
0cf0: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  or.** SQLITE_LOC
0d00: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
0d10: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 54  tatic int queryT
0d20: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
0d30: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
0d40: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
0d50: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
0d60: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
0d70: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
0d80: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
0d90: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
0da0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
0db0: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
0dc0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
0dd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
0de0: 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  0 );.  .  /* Thi
0df0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
0e00: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
0e10: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
0e20: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
0e30: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
0e40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
0e50: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
0e60: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
0e70: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
0e80: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
0e90: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
0ea0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
0eb0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
0ec0: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78  /.  if( pBt->pEx
0ed0: 63 6c 75 73 69 76 65 20 26 26 20 70 42 74 2d 3e  clusive && pBt->
0ee0: 70 45 78 63 6c 75 73 69 76 65 21 3d 70 20 29 7b  pExclusive!=p ){
0ef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0f00: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a  TE_LOCKED;.  }..
0f10: 20 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67    /* This (along
0f20: 20 77 69 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28   with lockTable(
0f30: 29 29 20 69 73 20 77 68 65 72 65 20 74 68 65 20  )) is where the 
0f40: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
0f50: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 64 65 61  flag is.  ** dea
0f60: 6c 74 20 77 69 74 68 2e 20 49 66 20 74 68 65 20  lt with. If the 
0f70: 63 61 6c 6c 65 72 20 69 73 20 71 75 65 72 79 69  caller is queryi
0f80: 6e 67 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f  ng for a read-lo
0f90: 63 6b 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20  ck and the flag 
0fa0: 69 73 0a 20 20 2a 2a 20 73 65 74 2c 20 69 74 20  is.  ** set, it 
0fb0: 69 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  is unconditional
0fc0: 6c 79 20 67 72 61 6e 74 65 64 20 2d 20 65 76 65  ly granted - eve
0fd0: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 77  n if there are w
0fe0: 72 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20  rite-locks.  ** 
0ff0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66  on the table. If
1000: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73   a write-lock is
1010: 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 20   requested, the 
1020: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
1030: 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  flag.  ** is not
1040: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a   considered..  *
1050: 2a 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69  *.  ** In functi
1060: 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20  on lockTable(), 
1070: 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  if a read-lock i
1080: 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64 20 74  s demanded and t
1090: 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63  he .  ** ReadUnc
10a0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
10b0: 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69   set, no entry i
10c0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  s added to the l
10d0: 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20  ocks list .  ** 
10e0: 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29  (BtShared.pLock)
10f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73  ..  **.  ** To s
1100: 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74 68 65  ummarize: If the
1110: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
1120: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
1130: 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  en read cursors 
1140: 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61  do.  ** not crea
1150: 74 65 20 6f 72 20 72 65 73 70 65 63 74 20 74 61  te or respect ta
1160: 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c  ble locks. The l
1170: 6f 63 6b 69 6e 67 20 70 72 6f 63 65 64 75 72 65  ocking procedure
1180: 20 66 6f 72 20 61 20 0a 20 20 2a 2a 20 77 72 69   for a .  ** wri
1190: 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e  te-cursor does n
11a0: 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  ot change..  */.
11b0: 20 20 69 66 28 20 0a 20 20 20 20 30 3d 3d 28 70    if( .    0==(p
11c0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
11d0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
11e0: 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63  ed) || .    eLoc
11f0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
1200: 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45  .    iTab==MASTE
1210: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1220: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1230: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1240: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1250: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
1260: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20  r->pBtree!=p && 
1270: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
1280: 54 61 62 20 26 26 20 0a 20 20 20 20 20 20 20 20  Tab && .        
1290: 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21    (pIter->eLock!
12a0: 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21  =eLock || eLock!
12b0: 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  =READ_LOCK) ){. 
12c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12d0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
12e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
12f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1300: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
1310: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1320: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
1330: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1340: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
1350: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
1360: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
1370: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
1380: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
1390: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
13a0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
13b0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
13c0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
13d0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
13e0: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
13f0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1400: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1410: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
1420: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
1430: 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53  TE_BUSY and.** S
1440: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20  QLITE_NOMEM may 
1450: 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64  also be returned
1460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1470: 6c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20  lockTable(Btree 
1480: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
1490: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
14a0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14b0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
14c0: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
14d0: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
14e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
14f0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
1510: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
1520: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
1530: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1540: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
1550: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  /* This is a no-
1560: 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64  op if the shared
1570: 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e  -cache is not en
1580: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21  abled */.  if( !
1590: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
15a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15b0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
15c0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
15d0: 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
15e0: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
15f0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1600: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
1610: 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
1620: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
1630: 72 65 71 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20  requested,.  ** 
1640: 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74  return early wit
1650: 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65  hout adding an e
1660: 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74 53 68  ntry to the BtSh
1670: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e  ared.pLock list.
1680: 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e   See.  ** commen
1690: 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75  t in function qu
16a0: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66  eryTableLock() f
16b0: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20  or more info on 
16c0: 68 61 6e 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74  handling .  ** t
16d0: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
16e0: 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20  ed flag..  */.  
16f0: 69 66 28 20 0a 20 20 20 20 28 70 2d 3e 64 62 2d  if( .    (p->db-
1700: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
1710: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26  adUncommitted) &
1720: 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52  & .    (eLock==R
1730: 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20  EAD_LOCK) &&.   
1740: 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f   iTable!=MASTER_
1750: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65  ROOT.  ){.    re
1760: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1770: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
1780: 73 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20  search the list 
1790: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
17a0: 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62  lock on this tab
17b0: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74  le. */.  for(pIt
17c0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
17d0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
17e0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
17f0: 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  f( pIter->iTable
1800: 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65  ==iTable && pIte
1810: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  r->pBtree==p ){.
1820: 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49        pLock = pI
1830: 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ter;.      break
1840: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1850: 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73  * If the above s
1860: 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69  earch did not fi
1870: 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75  nd a BtLock stru
1880: 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42  ct associating B
1890: 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68  tree p.  ** with
18a0: 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61   table iTable, a
18b0: 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20  llocate one and 
18c0: 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65  link it into the
18d0: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   list..  */.  if
18e0: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
18f0: 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20  pLock = (BtLock 
1900: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1910: 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63  ero(sizeof(BtLoc
1920: 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c  k));.    if( !pL
1930: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ock ){.      ret
1940: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1950: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
1960: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
1970: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
1980: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
1990: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
19a0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
19b0: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
19c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
19d0: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
19e0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
19f0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
1a00: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
1a10: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
1a20: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
1a30: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
1a40: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
1a50: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
1a60: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
1a70: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
1a80: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
1a90: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
1aa0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
1ab0: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
1ac0: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
1ad0: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
1ae0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
1af0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
1b00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b10: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1b20: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
1b30: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
1b40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b50: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1b60: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
1b70: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
1b80: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
1b90: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 74  d via calls to t
1ba0: 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29 0a 2a  he lockTable().*
1bb0: 2a 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  * procedure) hel
1bc0: 64 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c  d by Btree handl
1bd0: 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e p..*/.static v
1be0: 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  oid unlockAllTab
1bf0: 6c 65 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  les(Btree *p){. 
1c00: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c10: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
1c20: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
1c30: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
1c40: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1c50: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
1c70: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
1c80: 70 49 74 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c  pIter );..  whil
1c90: 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20  e( *ppIter ){.  
1ca0: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
1cb0: 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61  = *ppIter;.    a
1cc0: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 45 78 63  ssert( pBt->pExc
1cd0: 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74  lusive==0 || pBt
1ce0: 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 70 4c  ->pExclusive==pL
1cf0: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
1d00: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1d10: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
1d20: 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b   *ppIter = pLock
1d30: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
1d40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
1d50: 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
1d60: 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70       ppIter = &p
1d70: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
1d80: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42   }.  }..  if( pB
1d90: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 70  t->pExclusive==p
1da0: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 45 78   ){.    pBt->pEx
1db0: 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 7d  clusive = 0;.  }
1dc0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1dd0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1de0: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
1df0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
1e00: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
1e10: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
1e20: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
1e30: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
1e40: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
1e50: 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
1e60: 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64  tShared.*/.#ifnd
1e70: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
1e80: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
1e90: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
1ea0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
1eb0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1ec0: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
1ed0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
1ee0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1ef0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e  NCRBLOB./*.** In
1f00: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
1f10: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1f20: 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72  cache for cursor
1f30: 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a   pCur, if any..*
1f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
1f50: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1f60: 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a  Cache(BtCursor *
1f70: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
1f80: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1f90: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
1fa0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
1fb0: 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43  aOverflow);.  pC
1fc0: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
1fd0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  0;.}../*.** Inva
1fe0: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
1ff0: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
2000: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
2010: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
2020: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
2030: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
2040: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2050: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
2060: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
2070: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
2080: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
2090: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
20a0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
20b0: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
20c0: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
20d0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
20e0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
20f0: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
2100: 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
2110: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
2120: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
2130: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
2140: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
2150: 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e(x).#endif../*.
2160: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
2170: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2180: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
2190: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
21a0: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
21b0: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
21c0: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
21d0: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
21e0: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74  QUIRESEEK..*/.st
21f0: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
2200: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
2210: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2220: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
2230: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
2240: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
2250: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
2260: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
2270: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2280: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
2290: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
22a0: 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
22b0: 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a   &pCur->nKey);..
22c0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
22d0: 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c  an intKey table,
22e0: 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20   then the above 
22f0: 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79  call to BtreeKey
2300: 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72  Size().  ** stor
2310: 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  es the integer k
2320: 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ey in pCur->nKey
2330: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2340: 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a  his value is.  *
2350: 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65  * all that is re
2360: 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73  quired. Otherwis
2370: 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f  e, if pCur is no
2380: 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  t open on an int
2390: 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20  Key.  ** table, 
23a0: 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63  then malloc spac
23b0: 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20  e for and store 
23c0: 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  the pCur->nKey b
23d0: 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a  ytes of key .  *
23e0: 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69  * data..  */.  i
23f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2400: 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50   && 0==pCur->apP
2410: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b  age[0]->intKey){
2420: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
2430: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2440: 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20  pCur->nKey);.   
2450: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
2460: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2470: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
2480: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65   pCur->nKey, pKe
2490: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
24a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24b0: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
24c0: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
24d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
24e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
24f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2500: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2510: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2520: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2530: 74 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65  t( !pCur->apPage
2540: 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  [0]->intKey || !
2550: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
2560: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2570: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OK ){.    int i;
2580: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2590: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
25a0: 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
25b0: 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
25c0: 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43  ge[i]);.      pC
25d0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
25e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  0;.    }.    pCu
25f0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
2600: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2610: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
2620: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
2630: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
2640: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
2650: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2660: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
2670: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
2680: 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63 65  ors except pExce
2690: 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74  pt open on the t
26a0: 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f  able .** with ro
26b0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
26c0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
26d0: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
26e0: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
26f0: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
2700: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
2710: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
2720: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
2730: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
2740: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2750: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
2760: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
2770: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
2780: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
2790: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
27a0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
27b0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
27c0: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
27d0: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
27e0: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
27f0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
2800: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
2810: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
2820: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
2830: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
2840: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
2850: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
2860: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
2870: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
2880: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
2890: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
28a0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
28b0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
28f0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
2900: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
2910: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2920: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
2930: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2940: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
2950: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2960: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
2970: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
2980: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
2990: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
29a0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
29b0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  LID;.}../*.** Re
29c0: 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
29d0: 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
29e0: 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61   it was in (or a
29f0: 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f  s close to as po
2a00: 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20  ssible).** when 
2a10: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
2a20: 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e  on() was called.
2a30: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
2a40: 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65  call deletes the
2a50: 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74   .** saved posit
2a60: 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20  ion info stored 
2a70: 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  by saveCursorPos
2a80: 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72  ition(), so ther
2a90: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d  e can be.** at m
2aa0: 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76  ost one effectiv
2ab0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
2ac0: 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61  osition() call a
2ad0: 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61  fter each .** sa
2ae0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
2af0: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
2b00: 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43 75  e3BtreeRestoreCu
2b10: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
2b20: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2b30: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
2b40: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2b50: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2b60: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2b70: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
2b80: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
2b90: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2ba0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
2bb0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2bc0: 6b 69 70 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  kip;.  }.  pCur-
2bd0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2be0: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
2bf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2c00: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
2c10: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
2c20: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
2c30: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2c40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2c50: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
2c60: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
2c70: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
2c80: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2c90: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2ca0: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2cb0: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2cc0: 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ID );.  }.  retu
2cd0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
2ce0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
2cf0: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
2d00: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
2d10: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
2d20: 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  \.         sqlit
2d30: 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43 75  e3BtreeRestoreCu
2d40: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
2d50: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
2d60: 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44  ITE_OK)../*.** D
2d70: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2d80: 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72   or not a cursor
2d90: 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20   has moved from 
2da0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a  the position it.
2db0: 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  ** was last plac
2dc0: 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20  ed at.  Cursors 
2dd0: 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68  can move when th
2de0: 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70  e row they are p
2df0: 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73  ointing.** at is
2e00: 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
2e10: 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a  m under them..**
2e20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2e30: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
2e40: 72 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68  r code if someth
2e50: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20  ing goes wrong. 
2e60: 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   The.** integer 
2e70: 2a 70 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65  *pHasMoved is se
2e80: 74 20 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20  t to one if the 
2e90: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
2ea0: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
2eb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2ec0: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
2ed0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2ee0: 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29   int *pHasMoved)
2ef0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  {.  int rc;..  r
2f00: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2f10: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2f20: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2f30: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
2f40: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2f50: 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
2f60: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2f70: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b  ALID || pCur->sk
2f80: 69 70 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  ip!=0 ){.    *pH
2f90: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
2fa0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
2fb0: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
2fc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fd0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2fe0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2ff0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
3000: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
3010: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
3020: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
3030: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
3040: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
3050: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
3060: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
3070: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
3080: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
3090: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  r..*/.static Pgn
30a0: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
30b0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
30c0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
30d0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
30e0: 2c 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  , iPtrMap, ret;.
30f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3100: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3110: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50  ->mutex) );.  nP
3120: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
3130: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
3140: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
3150: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
3160: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
3170: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
3180: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
3190: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
31a0: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
31b0: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
31c0: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
31d0: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
31e0: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
31f0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
3200: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
3210: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
3220: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
3230: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
3240: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
3250: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
3260: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
3270: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
3280: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
3290: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
32a0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
32b0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
32c0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
32d0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
32e0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
32f0: 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Put(BtShared *pB
3300: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
3310: 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65  eType, Pgno pare
3320: 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  nt){.  DbPage *p
3330: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
3340: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
3350: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
3360: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
3370: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
3380: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
3390: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
33a0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
33b0: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
33c0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
33d0: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
33e0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
33f0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
3400: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3410: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3420: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
3430: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
3440: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
3450: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
3460: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
3470: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
3480: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
3490: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
34a0: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
34b0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
34c0: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
34d0: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
34e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
3500: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
3510: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
3520: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
3530: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
3540: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
3550: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
3560: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3570: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
3580: 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65   rc;.  }.  offse
3590: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
35a0: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
35b0: 79 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20  y);.  pPtrmap = 
35c0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
35d0: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
35e0: 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  e);..  if( eType
35f0: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
3600: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
3610: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
3620: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
3630: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
3640: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
3650: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
3660: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
3670: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
3680: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
3690: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
36a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36b0: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
36c0: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
36d0: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
36e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
36f0: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
3700: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
3710: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
3720: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3730: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
3740: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
3750: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
3760: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
3770: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
3780: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
3790: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
37a0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
37b0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
37c0: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
37d0: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
37e0: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
37f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
3800: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
3810: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
3820: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
3830: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
3840: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
3850: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
3860: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
3870: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
3880: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
3890: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
38a0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
38b0: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
38c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
38d0: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
38e0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
38f0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
3900: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
3910: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
3920: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
3930: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
3940: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
3950: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
3960: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3970: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3980: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
3990: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
39a0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
39b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
39c0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
39d0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
39e0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
39f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
3a00: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
3a10: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
3a20: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
3a30: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
3a40: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
3a50: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
3a60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
3a70: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
3a80: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
3a90: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
3aa0: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
3ab0: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
3ac0: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
3ad0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
3ae0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
3af0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
3b00: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
3b10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
3b20: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
3b30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
3b40: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
3b50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
3b60: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
3b70: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
3b80: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
3b90: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
3ba0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
3bb0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
3bc0: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  e ptrmapPutOvfl(
3bd0: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  y,z) SQLITE_OK.#
3be0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
3bf0: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
3c00: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
3c10: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
3c20: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
3c30: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
3c40: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
3c50: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
3c60: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
3c70: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
3c80: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
3c90: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
3ca0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
3cb0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
3cc0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
3cd0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
3ce0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
3cf0: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
3d00: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
3d10: 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e   get2byte(&(P)->
3d20: 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f  aData[(P)->cellO
3d30: 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a  ffset+2*(I)]))).
3d40: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f  ./*.** This a mo
3d50: 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69  re complex versi
3d60: 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29  on of findCell()
3d70: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
3d80: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
3d90: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
3da0: 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e  w cells.  See in
3db0: 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75  sert.*/.static u
3dc0: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
3dd0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
3de0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
3df0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
3e00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3e10: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
3e20: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3e30: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
3e40: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
3e50: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
3e60: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
3e70: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
3e80: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
3e90: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
3ea0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
3eb0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
3ec0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
3ed0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
3ee0: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
3ef0: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
3f00: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
3f10: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
3f20: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
3f30: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
3f40: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
3f50: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
3f60: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
3f70: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
3f80: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
3f90: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
3fa0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c  s function.  sql
3fb0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3fc0: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
3fd0: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
3fe0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
3ff0: 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  nt and sqlite3Bt
4000: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
4010: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
4020: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
4030: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
4040: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
4050: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ment..**.** With
4060: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  in this file, th
4070: 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61  e parseCell() ma
4080: 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  cro can be calle
4090: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
40a0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
40b0: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
40c0: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
40d0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
40e0: 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  aster..*/.void s
40f0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
4100: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
4110: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
4120: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
4130: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
4140: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
4150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4160: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
4170: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
4180: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
4190: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
41a0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
41b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20  */.){.  int n;  
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
41e0: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
41f0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
4200: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
4210: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4220: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
4230: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
4240: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
4250: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
4260: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
4270: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
4280: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
4290: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
42a0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
42b0: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
42c0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
42d0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
42e0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
42f0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
4300: 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Key ){.    if( p
4310: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
4320: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  .      n += getV
4330: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
4340: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
4350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
4360: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
4370: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
4380: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
4390: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
43a0: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
43b0: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
43c0: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
43d0: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
43e0: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
43f0: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
4400: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
4410: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
4420: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
4430: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
4440: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
4450: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
4460: 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50  .  if( likely(nP
4470: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
4480: 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20  axLocal) ){.    
4490: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
44a0: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
44b0: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
44c0: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
44d0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
44e0: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
44f0: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
4500: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
4510: 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  nt nSize;       
4520: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
4530: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
4540: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
4550: 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61   nSize = nPayloa
4560: 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f  d + n;.    pInfo
4570: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c  ->nLocal = nPayl
4580: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
4590: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
45a0: 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20     if( (nSize & 
45b0: 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ~3)==0 ){.      
45c0: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
45d0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
45e0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
45f0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
4600: 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20  nSize = nSize;. 
4610: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
4620: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
4630: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
4640: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
4650: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
4660: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
4670: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
4680: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
4690: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
46a0: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
46b0: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
46c0: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
46d0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
46e0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
46f0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
4700: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
4710: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
4720: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
4730: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
4740: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
4750: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
4760: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
4770: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
4780: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
4790: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
47a0: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
47b0: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
47c0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
47d0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
47e0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
47f0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
4800: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
4810: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
4820: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
4830: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
4840: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
4850: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
4860: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
4870: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
4880: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
4890: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
48a0: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
48b0: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
48c0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
48d0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
48e0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
48f0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
4900: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
4910: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
4920: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
4930: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
4940: 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70  4);.    if( surp
4950: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
4960: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
4970: 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73  nLocal = surplus
4980: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4990: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
49a0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
49b0: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
49c0: 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d  verflow = pInfo-
49d0: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20  >nLocal + n;.   
49e0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
49f0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
4a00: 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66   + 4;.  }.}.#def
4a10: 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50  ine parseCell(pP
4a20: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
4a30: 6f 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74  o) \.  sqlite3Bt
4a40: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
4a50: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
4a60: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
4a70: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f  l)), (pInfo)).vo
4a80: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  id sqlite3BtreeP
4a90: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
4aa0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
4ab0: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
4ac0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
4ad0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4af0: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
4b00: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
4b10: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
4b20: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
4b30: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
4b40: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
4b50: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
4b60: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
4b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
4b80: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
4b90: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
4ba0: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
4bb0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
4bc0: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
4bd0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
4be0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
4bf0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
4c00: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
4c10: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
4c20: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
4c30: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
4c40: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
4c50: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
4c60: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64  ointer..*/.#ifnd
4c70: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
4c80: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
4c90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
4ca0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c  t iCell){.  Cell
4cb0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c  Info info;.  sql
4cc0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
4cd0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
4ce0: 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72   &info);.  retur
4cf0: 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a  n info.nSize;.}.
4d00: 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 75 31  #endif.static u1
4d10: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
4d20: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
4d30: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c   *pCell){.  Cell
4d40: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c  Info info;.  sql
4d50: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
4d60: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
4d70: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65  ll, &info);.  re
4d80: 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  turn info.nSize;
4d90: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
4da0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
4db0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
4dc0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
4dd0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
4de0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
4df0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
4e00: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
4e10: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
4e20: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
4e30: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
4e40: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
4e50: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
4e60: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
4e70: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
4e80: 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  l){.  CellInfo i
4e90: 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nfo;.  assert( p
4ea0: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c  Cell!=0 );.  sql
4eb0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
4ec0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
4ed0: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
4ee0: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
4ef0: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
4f00: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
4f10: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
4f20: 0a 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61  .  if( (info.nDa
4f30: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
4f40: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e  y?0:info.nKey))>
4f50: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
4f60: 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
4f70: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
4f80: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
4f90: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d  .    return ptrm
4fa0: 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74  apPut(pPage->pBt
4fb0: 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  , ovfl, PTRMAP_O
4fc0: 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
4fd0: 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
4fe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4ff0: 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  }./*.** If the c
5000: 65 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69  ell with index i
5010: 43 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  Cell on page pPa
5020: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
5030: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
5040: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
5050: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
5060: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
5070: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
5080: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
5090: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
50a0: 70 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65  pPutOvfl(MemPage
50b0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
50c0: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  ll){.  u8 *pCell
50d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
50e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
50f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
5100: 29 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  ) );.  pCell = f
5110: 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
5120: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20  pPage, iCell);. 
5130: 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
5140: 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
5150: 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  pCell);.}.#endif
5160: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
5170: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
5180: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
5190: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
51a0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
51b0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
51c0: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
51d0: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
51e0: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
51f0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
5200: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
5210: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
5220: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
5230: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
5240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5250: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
5260: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
5270: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5290: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
52a0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52c0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74  Address of a i-t
52d0: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
52e0: 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
52f0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
5300: 20 6f 66 20 66 69 72 73 74 20 62 79 74 65 20 61   of first byte a
5310: 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65  fter cell pointe
5320: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
5330: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
5340: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
5350: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
5360: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
5370: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
5380: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
5390: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
53a0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
53b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
53c0: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
53d0: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
53e0: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
53f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
5400: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
5410: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
5420: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5440: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
5450: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
5460: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
5470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5480: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5490: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
54a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
54b0: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
54c0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
54d0: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
54e0: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
54f0: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
5500: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
5510: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
5520: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
5530: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
5540: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
5550: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
5560: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5570: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
5580: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
5590: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
55a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
55b0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
55c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
55d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
55e0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
55f0: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c   );.  temp = sql
5600: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
5610: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
5620: 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d  Pager);.  data =
5630: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
5640: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
5650: 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f  rOffset;.  cellO
5660: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
5670: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65  ellOffset;.  nCe
5680: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
5690: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  l;.  assert( nCe
56a0: 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  ll==get2byte(&da
56b0: 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20  ta[hdr+3]) );.  
56c0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
56d0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
56e0: 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65  ize;.  cbrk = ge
56f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5700: 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  +5]);.  memcpy(&
5710: 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74  temp[cbrk], &dat
5720: 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  a[cbrk], usableS
5730: 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63  ize - cbrk);.  c
5740: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
5750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5760: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
5770: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
5780: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
5790: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
57a0: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
57b0: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
57c0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
57d0: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 69 66  e(pAddr);.    if
57e0: 20 28 70 63 20 3e 3d 20 70 50 61 67 65 2d 3e 70   (pc >= pPage->p
57f0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20  Bt->usableSize) 
5800: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
5810: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
5820: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 69  PT;.    }.    si
5830: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
5840: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
5850: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
5860: 73 69 7a 65 3b 0a 20 20 20 20 69 66 20 28 28 63  size;.    if ((c
5870: 62 72 6b 20 3c 20 63 65 6c 6c 4f 66 66 73 65 74  brk < cellOffset
5880: 2b 32 2a 6e 43 65 6c 6c 29 20 7c 7c 20 28 63 62  +2*nCell) || (cb
5890: 72 6b 2b 73 69 7a 65 3e 70 50 61 67 65 2d 3e 70  rk+size>pPage->p
58a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 29  Bt->usableSize))
58b0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
58c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
58d0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  KPT;.    }.    m
58e0: 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b  emcpy(&data[cbrk
58f0: 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69  ], &temp[pc], si
5900: 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ze);.    put2byt
5910: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
5920: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
5930: 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32  rk>=cellOffset+2
5940: 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32  *nCell );.  put2
5950: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
5960: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
5970: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
5980: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
5990: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
59a0: 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c  0;.  addr = cell
59b0: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a  Offset+2*nCell;.
59c0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61    memset(&data[a
59d0: 64 64 72 5d 2c 20 30 2c 20 63 62 72 6b 2d 61 64  ddr], 0, cbrk-ad
59e0: 64 72 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  dr);.  if( cbrk-
59f0: 61 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e 46 72  addr!=pPage->nFr
5a00: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
5a10: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
5a20: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
5a30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5a40: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
5a50: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
5a60: 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a  pace on a page..
5a70: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
5a80: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
5a90: 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68  e->aData[] of th
5aa0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a  e first byte of.
5ab0: 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  ** the new alloc
5ac0: 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61 6c 6c  ation.  The call
5ad0: 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  er guarantees th
5ae0: 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
5af0: 67 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20 54 68  gh.** space.  Th
5b00: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
5b10: 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  never fail..**.*
5b20: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f  * If the page co
5b30: 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f 66  ntains nBytes of
5b40: 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74 20   free space but 
5b50: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
5b60: 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63 6f  .** nBytes of co
5b70: 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73 70  ntiguous free sp
5b80: 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ace, then this r
5b90: 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69 63  outine automatic
5ba0: 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65  ally.** calls de
5bb0: 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29 20  fragementPage() 
5bc0: 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61  to consolidate a
5bd0: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62 65  ll free space be
5be0: 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  fore .** allocat
5bf0: 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75 6e  ing the new chun
5c00: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
5c10: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
5c20: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
5c30: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74  nt nByte){.  int
5c40: 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a   addr, pc, hdr;.
5c50: 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e    int size;.  in
5c60: 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20 74  t nFrag;.  int t
5c70: 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  op;.  int nCell;
5c80: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
5c90: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
5ca0: 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64  ar *data;.  .  d
5cb0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
5cc0: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ta;.  assert( sq
5cd0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
5ce0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
5cf0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
5d00: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
5d10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5d20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
5d30: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
5d40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
5d50: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
5d60: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
5d70: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
5d80: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
5d90: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
5da0: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
5db0: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67  low==0 );.  pPag
5dc0: 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74  e->nFree -= nByt
5dd0: 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  e;.  hdr = pPage
5de0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20  ->hdrOffset;..  
5df0: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
5e00: 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  +7];.  if( nFrag
5e10: 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  <60 ){.    /* Se
5e20: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
5e30: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
5e40: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
5e50: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 20  to satisfy the. 
5e60: 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75     ** space requ
5e70: 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72  est. */.    addr
5e80: 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68   = hdr+1;.    wh
5e90: 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32 62  ile( (pc = get2b
5ea0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
5eb0: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a  )>0 ){.      siz
5ec0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
5ed0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
5ee0: 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65   if( size>=nByte
5ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5f00: 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b 0a  size<nByte+4 ){.
5f10: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
5f20: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
5f30: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
5f40: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
5f50: 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73 69 7a  7] = nFrag + siz
5f60: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
5f70: 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b 0a       return pc;.
5f80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5f90: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
5fa0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 73  e(&data[pc+2], s
5fb0: 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20 20  ize-nByte);.    
5fc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20        return pc 
5fd0: 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  + size - nByte;.
5fe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5ff0: 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  }.      addr = p
6000: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
6010: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
6020: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
6030: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
6040: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
6050: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
6060: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
6070: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  ..  */.  top = g
6080: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
6090: 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d  r+5]);.  nCell =
60a0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
60b0: 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4f  hdr+3]);.  cellO
60c0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
60d0: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28  ellOffset;.  if(
60e0: 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63 65   nFrag>=60 || ce
60f0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
6100: 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74 65  ll > top - nByte
6110: 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67 6d 65   ){.    defragme
6120: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
6130: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
6140: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
6150: 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42  .  }.  top -= nB
6160: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  yte;.  assert( c
6170: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
6180: 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20  ell <= top );.  
6190: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
61a0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
61b0: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
61c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
61d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
61e0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
61f0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
6200: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
6210: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
6220: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
6230: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
6240: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6250: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
6260: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
6270: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
6280: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
6290: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
62a0: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
62b0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
62c0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
62d0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
62e0: 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  id freeSpace(Mem
62f0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6300: 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65   start, int size
6310: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
6320: 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e  begin, hdr;.  un
6330: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
6340: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
6350: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
6360: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
6370: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
6380: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
6390: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
63a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
63b0: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
63c0: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
63d0: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
63e0: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
63f0: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
6400: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
6410: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6420: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6430: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
6450: 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e  e>=0 );   /* Min
6460: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
6470: 73 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  s 4 */..#ifdef S
6480: 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
6490: 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69  ETE.  /* Overwri
64a0: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
64b0: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
64c0: 73 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52  s when the SECUR
64d0: 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f  E_DELETE .  ** o
64e0: 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
64f0: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
6500: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   */.  memset(&da
6510: 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69  ta[start], 0, si
6520: 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
6530: 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20  * Add the space 
6540: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69  back into the li
6550: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65  nked list of fre
6560: 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72  eblocks */.  hdr
6570: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
6580: 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64  set;.  addr = hd
6590: 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  r + 1;.  while( 
65a0: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
65b0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
65c0: 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e  <start && pbegin
65d0: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
65e0: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
65f0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6600: 2d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -4 );.    assert
6610: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
6620: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67  .    addr = pbeg
6630: 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  in;.  }.  assert
6640: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
6650: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6660: 2d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -4 );.  assert( 
6670: 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70  pbegin>addr || p
6680: 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75  begin==0 );.  pu
6690: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
66a0: 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75  r], start);.  pu
66b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
66c0: 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20  rt], pbegin);.  
66d0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
66e0: 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a  tart+2], size);.
66f0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
6700: 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  = size;..  /* Co
6710: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
6720: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
6730: 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68   addr = pPage->h
6740: 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20  drOffset + 1;.  
6750: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
6760: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6770: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
6780: 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a   int pnext, psiz
6790: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
67a0: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
67b0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
67c0: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
67d0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
67e0: 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79    pnext = get2by
67f0: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
6800: 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67  );.    psize = g
6810: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
6820: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66  egin+2]);.    if
6830: 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65  ( pbegin + psize
6840: 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26   + 3 >= pnext &&
6850: 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20   pnext>0 ){.    
6860: 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65    int frag = pne
6870: 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69  xt - (pbegin+psi
6880: 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ze);.      asser
6890: 74 28 20 66 72 61 67 3c 3d 64 61 74 61 5b 70 50  t( frag<=data[pP
68a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37  age->hdrOffset+7
68b0: 5d 20 29 3b 0a 20 20 20 20 20 20 64 61 74 61 5b  ] );.      data[
68c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
68d0: 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20  +7] -= frag;.   
68e0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
68f0: 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74 32 62  a[pbegin], get2b
6900: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
6910: 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  ));.      put2by
6920: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
6930: 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32 62 79  2], pnext+get2by
6940: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32  te(&data[pnext+2
6950: 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20 20 20  ])-pbegin);.    
6960: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
6970: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  r = pbegin;.    
6980: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
6990: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
69a0: 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68  area begins with
69b0: 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65   a freeblock, re
69c0: 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66  move it. */.  if
69d0: 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64  ( data[hdr+1]==d
69e0: 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61  ata[hdr+5] && da
69f0: 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b  ta[hdr+2]==data[
6a00: 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e  hdr+6] ){.    in
6a10: 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69  t top;.    pbegi
6a20: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
6a30: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
6a40: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72  memcpy(&data[hdr
6a50: 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69  +1], &data[pbegi
6a60: 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20  n], 2);.    top 
6a70: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6a80: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75  [hdr+5]);.    pu
6a90: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
6aa0: 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74 32 62  +5], top + get2b
6ab0: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6ac0: 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  +2]));.  }.}../*
6ad0: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
6ae0: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
6af0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
6b00: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
6b10: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
6b20: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
6b30: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
6b40: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
6b50: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
6b60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
6b70: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
6b80: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
6b90: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
6ba0: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
6bb0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
6bc0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
6bd0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
6be0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
6bf0: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
6c00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6c10: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
6c20: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
6c30: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
6c40: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
6c50: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
6c60: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
6c70: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6c80: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
6c90: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
6ca0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
6cb0: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
6cc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
6cd0: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
6ce0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
6cf0: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
6d00: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6d10: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
6d20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
6d30: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 66 6c 61  Page->leaf = fla
6d40: 67 42 79 74 65 3e 3e 33 3b 20 20 61 73 73 65 72  gByte>>3;  asser
6d50: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
6d60: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
6d70: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
6d80: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
6d90: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
6da0: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d  e->leaf;.  pBt =
6db0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
6dc0: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
6dd0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
6de0: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
6df0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
6e00: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  1;.    pPage->ha
6e10: 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c  sData = pPage->l
6e20: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
6e30: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
6e40: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
6e50: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
6e60: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
6e70: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
6e80: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
6e90: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
6ea0: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
6eb0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30  age->hasData = 0
6ec0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
6ed0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
6ee0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
6ef0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
6f00: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
6f10: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
6f20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6f30: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
6f40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6f50: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
6f60: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
6f70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
6f80: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
6f90: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
6fa0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
6fb0: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
6fc0: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
6fd0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
6fe0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
6ff0: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
7000: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
7010: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
7020: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
7030: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
7040: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
7050: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
7060: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
7070: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
7080: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
7090: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
70a0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  rruption..*/.int
70b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
70c0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
70d0: 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74  Page){..  assert
70e0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
70f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7100: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7110: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
7120: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
7130: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c  pPage->pgno==sql
7140: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
7150: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
7160: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
7170: 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65   pPage == sqlite
7180: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
7190: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
71a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
71b0: 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69  e->aData == sqli
71c0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
71d0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
71e0: 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
71f0: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
7200: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
7210: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
7220: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
7230: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
7240: 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 64  [] */.    int hd
7250: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
7260: 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e  Offset to beginn
7270: 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64  ing of page head
7280: 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61  er */.    u8 *da
7290: 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
72a0: 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
72b0: 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53  aData */.    BtS
72c0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
72d0: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
72e0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
72f0: 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65  /.    int usable
7300: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
7310: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
7320: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
7330: 2a 2f 0a 20 20 20 20 69 6e 74 20 63 65 6c 6c 4f  */.    int cellO
7340: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66  ffset;    /* Off
7350: 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f  set from start o
7360: 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20  f page to first 
7370: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
7380: 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20      int nFree;  
7390: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
73a0: 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73   of unused bytes
73b0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
73c0: 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20      int top;    
73d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
73e0: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
73f0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
7400: 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67  ..    pBt = pPag
7410: 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72  e->pBt;..    hdr
7420: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
7430: 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  set;.    data = 
7440: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
7450: 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67    if( decodeFlag
7460: 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64  s(pPage, data[hd
7470: 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r]) ) return SQL
7480: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7490: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
74a0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
74b0: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
74c0: 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20  e<=32768 );.    
74d0: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
74e0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
74f0: 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  - 1;.    pPage->
7500: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
7510: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
7520: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
7530: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
7540: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
7550: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
7560: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
7570: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
7580: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
7590: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
75a0: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
75b0: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
75c0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
75d0: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
75e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61  {.      /* To ma
75f0: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
7600: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
7610: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
7620: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72  rrupt */.      r
7630: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7640: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
7650: 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  .  .    /* Compu
7660: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
7670: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
7680: 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20  age */.    pc = 
7690: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
76a0: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65  dr+1]);.    nFre
76b0: 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  e = data[hdr+7] 
76c0: 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66  + top - (cellOff
76d0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
76e0: 43 65 6c 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65  Cell);.    while
76f0: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
7700: 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  int next, size;.
7710: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
7720: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
7730: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
7740: 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61  ck is off the pa
7750: 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
7760: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7770: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
7780: 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
7790: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
77a0: 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
77b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
77c0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
77d0: 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  f( next>0 && nex
77e0: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a  t<=pc+size+3 ){.
77f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
7800: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
7810: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
7820: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  r */.        ret
7830: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7840: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
7850: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d  }.      nFree +=
7860: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20   size;.      pc 
7870: 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  = next;.    }.  
7880: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
7890: 20 6e 46 72 65 65 3b 0a 20 20 20 20 69 66 28 20   nFree;.    if( 
78a0: 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a  nFree>=usableSiz
78b0: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72  e ){.      /* Fr
78c0: 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20  ee space cannot 
78d0: 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67  exceed total pag
78e0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  e size */.      
78f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7900: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
7910: 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43   }..#if 0.  /* C
7920: 68 65 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68  heck that all th
7930: 65 20 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65  e offsets in the
7940: 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72   cell offset arr
7950: 61 79 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ay are within ra
7960: 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a  nge. .  ** .  **
7970: 20 4f 6d 69 74 74 69 6e 67 20 74 68 69 73 20 63   Omitting this c
7980: 6f 6e 73 69 73 74 65 6e 63 79 20 63 68 65 63 6b  onsistency check
7990: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70   and using the p
79a0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d  Page->maskPage m
79b0: 61 73 6b 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76  ask.  ** to prev
79c0: 65 6e 74 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20  ent overrunning 
79d0: 74 68 65 20 70 61 67 65 20 62 75 66 66 65 72 20  the page buffer 
79e0: 69 6e 20 66 69 6e 64 43 65 6c 6c 28 29 20 72 65  in findCell() re
79f0: 73 75 6c 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20  sults in a.  ** 
7a00: 32 2e 35 25 20 70 65 72 66 6f 72 6d 61 6e 63 65  2.5% performance
7a10: 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a   gain..  */.  {.
7a20: 20 20 20 20 75 38 20 2a 70 4f 66 66 3b 20 20 20      u8 *pOff;   
7a30: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
7a40: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 61   used to check a
7a50: 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20  ll cell offsets 
7a60: 61 72 65 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a  are in range */.
7a70: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20      u8 *pEnd;   
7a80: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
7a90: 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f  to end of cell o
7aa0: 66 66 73 65 74 20 61 72 72 61 79 20 2a 2f 0a 20  ffset array */. 
7ab0: 20 20 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20     u8 mask;     
7ac0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62      /* Mask of b
7ad0: 69 74 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  its that must be
7ae0: 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20   zero in MSB of 
7af0: 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a  cell offsets */.
7b00: 20 20 20 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75      mask = ~(((u
7b10: 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
7b20: 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 20 20 70 45  >>8))-1);.    pE
7b30: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
7b40: 66 66 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e  ffset + pPage->n
7b50: 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72  Cell*2];.    for
7b60: 28 70 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c  (pOff=&data[cell
7b70: 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70  Offset]; pOff!=p
7b80: 45 6e 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29  End && !((*pOff)
7b90: 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29  &mask); pOff+=2)
7ba0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 66 66 21 3d  ;.    if( pOff!=
7bb0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 72 65  pEnd ){.      re
7bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7bd0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
7be0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
7bf0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
7c00: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
7c10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
7c20: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
7c30: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
7c40: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
7c50: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
7c60: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
7c70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7c80: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
7c90: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
7ca0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
7cb0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
7cc0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
7cd0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
7ce0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
7cf0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
7d00: 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66  rOffset;.  int f
7d10: 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
7d20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
7d30: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
7d40: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
7d50: 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
7d60: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
7d70: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
7d80: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
7d90: 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
7da0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
7db0: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
7dc0: 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20  DbPage) == data 
7dd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7de0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
7df0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
7e00: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
7e10: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7e20: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7e30: 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74 28 26   );.  /*memset(&
7e40: 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
7e50: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7e60: 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61 5b 68  hdr);*/.  data[h
7e70: 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66  dr] = flags;.  f
7e80: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
7e90: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
7ea0: 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73  EAF)==0);.  mems
7eb0: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
7ec0: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
7ed0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
7ee0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
7ef0: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
7f00: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
7f10: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
7f20: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
7f30: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
7f40: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
7f50: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
7f60: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
7f70: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
7f80: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
7f90: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
7fa0: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
7fb0: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
7fc0: 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38  >pageSize<=32768
7fd0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
7fe0: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
7ff0: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61  eSize - 1;.  pPa
8000: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
8010: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
8020: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
8030: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
8040: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
8050: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
8060: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
8070: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
8080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
8090: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
80a0: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
80b0: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
80c0: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
80d0: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
80e0: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
80f0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8100: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
8110: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
8120: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
8130: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8140: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
8150: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
8160: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
8170: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
8180: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
8190: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
81a0: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
81b0: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
81c0: 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
81d0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
81e0: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
81f0: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
8200: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
8210: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
8220: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
8230: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
8240: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
8250: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
8260: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
8270: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
8280: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
8290: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
82a0: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
82b0: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
82c0: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
82d0: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
82e0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
82f0: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
8300: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
8310: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
8320: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
8330: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
8340: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
8350: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
8360: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
8370: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
8380: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
8390: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
83a0: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
83b0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
83c0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
83d0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
83e0: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
83f0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
8400: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8410: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
8420: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
8430: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
8440: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
8450: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
8460: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  er */.  int noCo
8470: 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20  ntent        /* 
8480: 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65  Do not load page
8490: 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65   content if true
84a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
84b0: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
84c0: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
84d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
84e0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
84f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
8500: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
8510: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
8520: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
8530: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
8540: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
8550: 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d   rc;.  *ppPage =
8560: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
8570: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
8580: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75  no, pBt);.  retu
8590: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
85a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
85b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
85c0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
85d0: 61 67 65 73 2e 20 20 4f 72 20 72 65 74 75 72 6e  ages.  Or return
85e0: 20 2d 31 20 69 66 0a 2a 2a 20 74 68 65 72 65 20   -1 if.** there 
85f0: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 65  is any kind of e
8600: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
8610: 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75  int pagerPagecou
8620: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
8630: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
8640: 6e 74 20 6e 50 61 67 65 3b 0a 20 20 72 63 20 3d  nt nPage;.  rc =
8650: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
8660: 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
8670: 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  nPage);.  return
8680: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
8690: 6e 50 61 67 65 3a 2d 31 29 3b 0a 7d 0a 0a 2f 2a  nPage:-1);.}../*
86a0: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
86b0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e  rom the pager an
86c0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e  d initialize it.
86d0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
86e0: 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76  * is just a conv
86f0: 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20  enience wrapper 
8700: 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20  around separate 
8710: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
8720: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
8730: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72  ) and sqlite3Btr
8740: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f  eeInitPage()..*/
8750: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
8760: 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
8770: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
8780: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
8790: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
87a0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
87b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
87c0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
87d0: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
87e0: 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57  *ppPage     /* W
87f0: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
8800: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b  inter here */.){
8810: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
8820: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
8830: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
8840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8850: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8860: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
8870: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
8880: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8890: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
88a0: 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f   }..  /* It is o
88b0: 66 74 65 6e 20 74 68 65 20 63 61 73 65 20 74 68  ften the case th
88c0: 61 74 20 74 68 65 20 70 61 67 65 20 77 65 20 77  at the page we w
88d0: 61 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  ant is already i
88e0: 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66  n cache..  ** If
88f0: 20 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65   so, get it dire
8900: 63 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65  ctly.  This save
8910: 73 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67  s us from having
8920: 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61   to call.  ** pa
8930: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74  gerPagecount() t
8940: 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f  o make sure pgno
8950: 20 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74   is within limit
8960: 73 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74 73  s, which results
8970: 0a 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75  .  ** in a measu
8980: 72 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e  reable performan
8990: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e  ce improvements.
89a0: 0a 20 20 2a 2f 0a 20 20 70 44 62 50 61 67 65 20  .  */.  pDbPage 
89b0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
89c0: 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
89d0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
89e0: 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a  DbPage ){.    /*
89f0: 20 50 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   Page is already
8a00: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20   in cache */.   
8a10: 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
8a20: 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
8a30: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
8a40: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20  pgno, pBt);.    
8a50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8a60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
8a70: 50 61 67 65 20 6e 6f 74 20 69 6e 20 63 61 63 68  Page not in cach
8a80: 65 2e 20 20 41 63 71 75 69 72 65 20 69 74 2e 20  e.  Acquire it. 
8a90: 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
8aa0: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
8ab0: 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
8ac0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8ad0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8ae0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d   .    }.    rc =
8af0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8b00: 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
8b10: 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  ppPage, 0);.    
8b20: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
8b30: 72 63 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  rc;.    pPage = 
8b40: 2a 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69  *ppPage;.  }.  i
8b50: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
8b60: 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
8b70: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
8b80: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
8b90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8ba0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
8bb0: 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
8bc0: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
8bd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
8bf0: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
8c00: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
8c10: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
8c20: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
8c30: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
8c40: 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
8c50: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
8c60: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
8c70: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
8c80: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
8c90: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
8ca0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8cb0: 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65  >pBt );.    asse
8cc0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8cd0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
8ce0: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
8cf0: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  d*)pPage );.    
8d00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
8d10: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
8d20: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
8d30: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
8d40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8d50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8d60: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8d70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
8d80: 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70  erUnref(pPage->p
8d90: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
8da0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
8db0: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
8dc0: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
8dd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
8de0: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
8df0: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
8e00: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
8e10: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
8e20: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
8e30: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
8e40: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
8e50: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
8e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8e70: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
8e80: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
8e90: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
8ea0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
8eb0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
8ec0: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
8ed0: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
8ee0: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
8ef0: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
8f00: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
8f10: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
8f20: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
8f30: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
8f40: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
8f50: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61  Data);.  if( pPa
8f60: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
8f70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8f80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8f90: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8fa0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
8fb0: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
8fc0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
8fd0: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
8fe0: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  )>0 ){.      sql
8ff0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
9000: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
9010: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
9020: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
9030: 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65  dler for a btree
9040: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9050: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f  sqlite3BtreeInvo
9060: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
9070: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 29  id *pArg, int n)
9080: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
9090: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
90a0: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
90b0: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
90c0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
90d0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
90e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
90f0: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
9100: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
9110: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
9120: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
9130: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
9140: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
9150: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
9160: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
9170: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
9180: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61  ame is NULL.** a
9190: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69   new database wi
91a0: 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65  th a random name
91b0: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
91c0: 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65  is randomly name
91d0: 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  d.** database fi
91e0: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
91f0: 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ed when sqlite3B
9200: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
9210: 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69  alled..** If zFi
9220: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
9230: 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
9240: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
9250: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
9260: 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
9270: 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
9280: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
9290: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
92a0: 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73  treeOpen(.  cons
92b0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
92c0: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
92d0: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
92e0: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
92f0: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
9300: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9310: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
9320: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
9330: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
9340: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
9350: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
9360: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
9370: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
9380: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
9390: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
93a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
93b0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
93c0: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
93d0: 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
93e0: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
93f0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
9400: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a  s *pVfs;      /*
9410: 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   The VFS to use 
9420: 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a  for this btree *
9430: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
9440: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  t = 0;      /* S
9450: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
9460: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
9470: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
9480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
9490: 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
94a0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
94b0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52  ITE_OK;.  int nR
94c0: 65 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e  eserve;.  unsign
94d0: 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
94e0: 72 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20 53 65  r[100];..  /* Se
94f0: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
9500: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
9510: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
9520: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
9530: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
9540: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
9550: 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20  se. This symbol 
9560: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
9570: 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20   if.  ** either 
9580: 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61  of the shared-da
9590: 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d  ta or autovacuum
95a0: 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f   features are co
95b0: 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74  mpiled .  ** int
95c0: 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20  o the library.. 
95d0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
95e0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
95f0: 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64  RED_CACHE) || !d
9600: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9610: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20  IT_AUTOVACUUM). 
9620: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
9630: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
9640: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
9650: 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a  db = 0;.  #else.
9660: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
9670: 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  Memdb = zFilenam
9680: 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69  e && !strcmp(zFi
9690: 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
96a0: 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65  :");.  #endif.#e
96b0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
96c0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
96d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
96e0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
96f0: 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62   );..  pVfs = db
9700: 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71  ->pVfs;.  p = sq
9710: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
9720: 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
9730: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
9740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
9750: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e  MEM;.  }.  p->in
9760: 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
9770: 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62  NE;.  p->db = db
9780: 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ;..#if !defined(
9790: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
97a0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
97b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
97c0: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
97d0: 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
97e0: 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
97f0: 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
9800: 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
9810: 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
9820: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
9830: 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
9840: 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
9850: 28 20 69 73 4d 65 6d 64 62 3d 3d 30 0a 20 20 20  ( isMemdb==0.   
9860: 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
9870: 53 51 4c 49 54 45 5f 56 74 61 62 29 3d 3d 30 0a  SQLITE_Vtab)==0.
9880: 20 20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20     && zFilename 
9890: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 0a  && zFilename[0].
98a0: 20 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c    ){.    if( sql
98b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
98c0: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
98d0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  led ){.      int
98e0: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   nFullPathname =
98f0: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
9900: 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20  e+1;.      char 
9910: 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
9920: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
9930: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
9940: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
9950: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
9960: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
9970: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 62  le = 1;.      db
9980: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
9990: 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a 20  E_SharedCache;. 
99a0: 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
99b0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
99c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
99d0: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
99e0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
99f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
9a00: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
9a10: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
9a20: 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e  name, nFullPathn
9a30: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
9a40: 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  me);.      mutex
9a50: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
9a60: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
9a70: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
9a80: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
9a90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9aa0: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
9ab0: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
9ac0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
9ad0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
9ae0: 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
9af0: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
9b00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
9b10: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
9b20: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
9b30: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
9b40: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
9b50: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
9b60: 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  er)).           
9b70: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
9b80: 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
9b90: 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
9ba0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
9bb0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
9bc0: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
9bd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9be0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
9c00: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
9c10: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
9c20: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
9c30: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
9c40: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
9c50: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
9c60: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
9c70: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
9c80: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
9c90: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
9ca0: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
9cb0: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
9cc0: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
9cd0: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
9ce0: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
9cf0: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
9d00: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
9d10: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
9d20: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
9d30: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
9d40: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
9d50: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
9d60: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
9d70: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
9d80: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
9d90: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
9da0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
9db0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
9dc0: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
9dd0: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
9de0: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
9df0: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
9e00: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
9e10: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
9e20: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
9e30: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
9e40: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
9e50: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
9e60: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
9e70: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
9e80: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
9e90: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
9ea0: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
9eb0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
9ec0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
9ed0: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
9ee0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
9ef0: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
9f00: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
9f10: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
9f20: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
9f30: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
9f40: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
9f50: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
9f60: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
9f70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
9f80: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
9f90: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
9fa0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
9fb0: 7d 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48  }.    pBt->busyH
9fc0: 64 72 2e 78 46 75 6e 63 20 3d 20 73 71 6c 69 74  dr.xFunc = sqlit
9fd0: 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  e3BtreeInvokeBus
9fe0: 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 42  yHandler;.    pB
9ff0: 74 2d 3e 62 75 73 79 48 64 72 2e 70 41 72 67 20  t->busyHdr.pArg 
a000: 3d 20 70 42 74 3b 0a 20 20 20 20 72 63 20 3d 20  = pBt;.    rc = 
a010: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
a020: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
a030: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
a060: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
a070: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
a080: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
a090: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
a0a0: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
a0b0: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
a0c0: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
a0d0: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
a0e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a0f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a100: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
a110: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
a120: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
a130: 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
a140: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
a150: 74 2d 3e 62 75 73 79 48 64 72 29 3b 0a 20 20 20  t->busyHdr);.   
a160: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
a170: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67   .    sqlite3Pag
a180: 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42  erSetReiniter(pB
a190: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52  t->pPager, pageR
a1a0: 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d  einit);.    pBt-
a1b0: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
a1c0: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
a1d0: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64  0;.    pBt->read
a1e0: 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61  Only = sqlite3Pa
a1f0: 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
a200: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
a210: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
a220: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
a230: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  der[16]);.    if
a240: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
a250: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
a260: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
a270: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
a280: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
a290: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
a2a0: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
a2b0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
a2c0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  e = 0;.      sql
a2d0: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
a2e0: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
a2f0: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
a300: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
a310: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
a320: 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
a330: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
a340: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
a350: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
a360: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
a370: 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
a380: 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
a390: 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
a3a0: 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
a3b0: 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
a3c0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
a3d0: 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
a3e0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
a3f0: 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
a400: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
a410: 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
a420: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
a430: 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
a440: 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
a450: 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
a460: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
a470: 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
a480: 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
a490: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a4a0: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
a4b0: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
a4c0: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
a4d0: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
a4e0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
a4f0: 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
a500: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
a510: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
a520: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
a530: 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
a540: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
a550: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
a560: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a570: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
a580: 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
a590: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
a5a0: 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
a5b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
a5c0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
a5d0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
a5e0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
a5f0: 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
a600: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
a610: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
a620: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
a630: 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
a640: 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
a650: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62   }.    pBt->usab
a660: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
a670: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
a680: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
a690: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
a6a0: 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
a6b0: 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
a6c0: 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
a6d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
a6e0: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
a6f0: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
a700: 53 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21  Size);.   .#if !
a710: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a720: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
a730: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
a740: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
a750: 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
a760: 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
a770: 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
a780: 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
a790: 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
a7a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  */.    if( p->sh
a7b0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
a7c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
a7d0: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
a7e0: 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
a7f0: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
a800: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
a810: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
a820: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
a830: 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  R);.      if( SQ
a840: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
a850: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
a860: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
a870: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
a880: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
a890: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a8a0: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
a8b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
a8c0: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
a8d0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
a8e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
a8f0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
a900: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
a910: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
a920: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
a930: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a940: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a950: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
a960: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
a970: 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
a980: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
a990: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
a9a0: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
a9b0: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
a9c0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
a9d0: 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
a9e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a9f0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
aa00: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
aa10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
aa20: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
aa30: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
aa40: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
aa50: 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
aa60: 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
aa70: 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
aa80: 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
aa90: 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
aaa0: 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
aab0: 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
aac0: 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
aad0: 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
aae0: 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
aaf0: 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
ab00: 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
ab10: 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
ab20: 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
ab30: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
ab40: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
ab50: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
ab60: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
ab70: 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
ab80: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
ab90: 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
aba0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
abb0: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
abc0: 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
abd0: 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
abe0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
abf0: 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
ac00: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
ac10: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
ac20: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
ac30: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
ac40: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
ac50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ac60: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
ac70: 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
ac80: 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
ac90: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
aca0: 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
acb0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
acc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
acd0: 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
ace0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
acf0: 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
ad00: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
ad10: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
ad20: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
ad30: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
ad40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ad50: 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
ad60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ad70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ad80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
ad90: 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
ada0: 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
adb0: 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
adc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
add0: 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
ade0: 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
adf0: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
ae00: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
ae10: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ae20: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
ae30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
ae40: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
ae50: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
ae60: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
ae70: 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
ae80: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
ae90: 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
aea0: 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
aeb0: 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
aec0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
aed0: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
aee0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
aef0: 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
af00: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
af10: 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
af20: 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
af30: 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
af40: 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
af50: 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
af60: 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
af70: 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
af80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
af90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73  SHARED_CACHE.  s
afa0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
afb0: 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65  aster;.  BtShare
afc0: 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
afd0: 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
afe0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
aff0: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
b000: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
b010: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
b020: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
b030: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
b040: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
b050: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
b060: 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
b070: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
b080: 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
b090: 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
b0a0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
b0b0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
b0c0: 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
b0d0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
b0e0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
b0f0: 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
b100: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
b110: 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
b120: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
b130: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
b140: 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
b150: 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
b160: 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
b170: 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
b180: 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
b190: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
b1a0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
b1b0: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
b1c0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
b1d0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
b1e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
b1f0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
b200: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
b210: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
b220: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
b230: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
b240: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
b250: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
b260: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
b270: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
b280: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
b290: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
b2a0: 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
b2b0: 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
b2c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
b2d0: 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
b2e0: 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  pBt) bytes..*/.s
b2f0: 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
b300: 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
b310: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
b320: 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
b330: 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
b340: 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
b350: 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
b360: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
b370: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
b380: 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
b390: 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
b3a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
b3b0: 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
b3c0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
b3d0: 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
b3e0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
b3f0: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
b400: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
b410: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
b420: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
b430: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
b440: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b450: 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
b460: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
b470: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
b480: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
b490: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
b4a0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
b4b0: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
b4c0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
b4d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b4e0: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
b4f0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
b500: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
b510: 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
b520: 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
b530: 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
b540: 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
b550: 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
b560: 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
b570: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
b580: 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
b590: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
b5a0: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
b5b0: 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
b5c0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
b5d0: 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
b5e0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
b5f0: 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
b600: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
b610: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
b620: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
b630: 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
b640: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
b650: 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
b660: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
b670: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  treeRollback(p);
b680: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
b690: 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
b6a0: 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
b6b0: 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
b6c0: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
b6d0: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
b6e0: 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
b6f0: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
b700: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
b710: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
b720: 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
b730: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
b740: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
b750: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
b760: 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
b770: 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
b780: 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
b790: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
b7a0: 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
b7b0: 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
b7c0: 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
b7d0: 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
b7e0: 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
b7f0: 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
b800: 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
b810: 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
b820: 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
b830: 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
b840: 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
b850: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
b860: 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
b870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
b880: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
b890: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ger);.    if( pB
b8a0: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
b8b0: 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
b8c0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
b8d0: 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
b8e0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
b8f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b900: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
b910: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
b920: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
b930: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
b940: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b950: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
b960: 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
b970: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
b980: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
b990: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
b9a0: 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
b9b0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
b9c0: 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
b9d0: 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
b9e0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
b9f0: 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
ba00: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
ba10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ba20: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
ba30: 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
ba40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
ba50: 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
ba60: 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
ba70: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
ba80: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
ba90: 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
baa0: 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
bab0: 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
bac0: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
bad0: 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
bae0: 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
baf0: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
bb00: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
bb10: 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
bb20: 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
bb30: 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
bb40: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
bb50: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
bb60: 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
bb70: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
bb80: 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
bb90: 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
bba0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
bbb0: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
bbc0: 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
bbd0: 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
bbe0: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
bbf0: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
bc00: 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
bc10: 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
bc20: 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
bc30: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
bc40: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
bc50: 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
bc60: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
bc70: 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
bc80: 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
bc90: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
bca0: 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
bcb0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
bcc0: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
bcd0: 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
bce0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
bcf0: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
bd00: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
bd10: 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
bd20: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
bd30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
bd40: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
bd50: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
bd60: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
bd70: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
bd80: 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
bd90: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
bda0: 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
bdb0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
bdc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bdd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
bde0: 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
bdf0: 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
be00: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
be10: 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
be20: 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
be30: 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
be40: 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
be50: 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
be60: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
be70: 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
be80: 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
be90: 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
bea0: 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
beb0: 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
bec0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
bed0: 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
bee0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
bef0: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
bf00: 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
bf10: 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
bf20: 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
bf30: 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
bf40: 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
bf50: 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
bf60: 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
bf70: 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
bf80: 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
bf90: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
bfa0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
bfb0: 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
bfc0: 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
bfd0: 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  vel(Btree *p, in
bfe0: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
bff0: 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72  lSync){.  BtShar
c000: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
c010: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c020: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c030: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
c040: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c050: 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
c060: 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
c070: 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  evel(pBt->pPager
c080: 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e  , level, fullSyn
c090: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  c);.  sqlite3Btr
c0a0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c0b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c0c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c0d0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
c0e0: 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
c0f0: 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
c100: 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
c110: 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
c120: 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
c130: 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
c140: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
c150: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c160: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
c170: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
c180: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
c190: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
c1a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c1b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
c1c0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
c1d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
c1e0: 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
c1f0: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
c200: 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
c210: 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
c220: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
c230: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c240: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c250: 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  rc;.}..#if !defi
c260: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
c270: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
c280: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
c290: 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f  E_OMIT_VACUUM)./
c2a0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
c2b0: 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
c2c0: 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
c2d0: 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
c2e0: 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
c2f0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
c300: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
c310: 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
c320: 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
c330: 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
c340: 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
c350: 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
c360: 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
c370: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
c380: 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
c390: 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
c3a0: 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
c3b0: 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
c3c0: 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
c3d0: 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
c3e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c3f0: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
c400: 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
c410: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
c420: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
c430: 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
c440: 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
c450: 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
c460: 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
c470: 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
c480: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
c490: 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
c4a0: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
c4b0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
c4c0: 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
c4d0: 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
c4e0: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
c4f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
c500: 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
c510: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
c520: 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
c530: 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
c540: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
c550: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c560: 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
c570: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c580: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
c590: 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73  zeFixed ){.    s
c5a0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c5b0: 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
c5c0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
c5d0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
c5e0: 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
c5f0: 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
c600: 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
c610: 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  bleSize;.  }.  i
c620: 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  f( pageSize>=512
c630: 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
c640: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
c650: 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28  ZE &&.        ((
c660: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
c670: 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Size)==0 ){.    
c680: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
c690: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
c6a0: 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
c6b0: 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70  Page1 && !pBt->p
c6c0: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
c6d0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
c6e0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
c6f0: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
c700: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c710: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
c720: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
c730: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
c740: 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65   }.  pBt->usable
c750: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
c760: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
c770: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
c780: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
c790: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
c7a0: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
c7b0: 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
c7c0: 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
c7d0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
c7e0: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
c7f0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
c800: 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74  >pageSize;.}.int
c810: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
c820: 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
c830: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
c840: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
c850: 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
c860: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
c870: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
c880: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
c890: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
c8a0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
c8b0: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
c8c0: 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
c8d0: 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
c8e0: 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
c8f0: 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
c900: 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
c910: 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
c920: 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
c930: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
c940: 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
c950: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
c960: 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
c970: 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
c980: 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
c990: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
c9a0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
c9b0: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c9c0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
c9d0: 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
c9e0: 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
c9f0: 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
ca00: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
ca10: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e   return n;.}.#en
ca20: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ca30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
ca40: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
ca50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ca60: 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
ca70: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
ca80: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
ca90: 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
caa0: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
cab0: 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
cac0: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
cad0: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
cae0: 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
caf0: 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
cb00: 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
cb10: 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
cb20: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
cb30: 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
cb40: 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
cb50: 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
cb60: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
cb70: 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
cb80: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
cb90: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
cba0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
cbb0: 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
cbc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
cbd0: 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
cbe0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
cbf0: 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
cc00: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
cc10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cc20: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 61 76 20  TE_OK;.  int av 
cc30: 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3f 31 3a  = (autoVacuum?1:
cc40: 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  0);..  sqlite3Bt
cc50: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
cc60: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
cc70: 46 69 78 65 64 20 26 26 20 61 76 21 3d 70 42 74  Fixed && av!=pBt
cc80: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
cc90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cca0: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
ccb0: 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
ccc0: 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20 20 7d  Vacuum = av;.  }
ccd0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
cce0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
ccf0: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
cd00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
cd10: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
cd20: 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
cd30: 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
cd40: 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
cd50: 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
cd60: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
cd70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
cd80: 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
cd90: 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
cda0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
cdb0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
cdc0: 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
cdd0: 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
cde0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
cdf0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
ce00: 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
ce10: 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
ce20: 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
ce30: 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
ce40: 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
ce50: 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
ce60: 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
ce70: 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
ce80: 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
ce90: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
cea0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
ceb0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
cec0: 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63  * Get a referenc
ced0: 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74  e to pPage1 of t
cee0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
cef0: 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20  .  This will.** 
cf00: 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72  also acquire a r
cf10: 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20  eadlock on that 
cf20: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  file..**.** SQLI
cf30: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
cf40: 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  d on success.  I
cf50: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  f the file is no
cf60: 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d  t a.** well-form
cf70: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
cf80: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f  , then SQLITE_CO
cf90: 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
cfa0: 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d..** SQLITE_BUS
cfb0: 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  Y is returned if
cfc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
cfd0: 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45   locked.  SQLITE
cfe0: 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74  _NOMEM.** is ret
cff0: 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20  urned if we run 
d000: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a  out of memory. .
d010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
d020: 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64  ckBtree(BtShared
d030: 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
d040: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
d050: 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65  ge1;.  int nPage
d060: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
d070: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d080: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d090: 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
d0a0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d0b0: 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  _OK;.  rc = sqli
d0c0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
d0d0: 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
d0e0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
d0f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
d100: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
d110: 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
d120: 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
d130: 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
d140: 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
d150: 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
d160: 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20  ile. .  */.  rc 
d170: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
d180: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
d190: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
d1a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d1b0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61  K ){.    goto pa
d1c0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
d1d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61  .  }else if( nPa
d1e0: 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ge>0 ){.    int 
d1f0: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e  pageSize;.    in
d200: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
d210: 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
d220: 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
d230: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
d240: 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ADB;.    if( mem
d250: 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
d260: 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
d270: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
d280: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
d290: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
d2a0: 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
d2b0: 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
d2c0: 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
d2d0: 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
d2e0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
d2f0: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
d300: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d310: 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65  The maximum embe
d320: 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
d330: 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35  st be exactly 25
d340: 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69  %.  And the mini
d350: 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64  mum.    ** embed
d360: 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
d370: 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62  t be 12.5% for b
d380: 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e  oth leaf-data an
d390: 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e  d non-leaf-data.
d3a0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67  .    ** The orig
d3b0: 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f  inal design allo
d3c0: 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74  wed these amount
d3d0: 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61  s to vary, but a
d3e0: 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73  s of.    ** vers
d3f0: 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65  ion 3.6.0, we re
d400: 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65  quire them to be
d410: 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20   fixed..    */. 
d420: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
d430: 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c  age1[21], "\100\
d440: 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29  040\040",3)!=0 )
d450: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
d460: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
d470: 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
d480: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
d490: 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69  age1[16]);.    i
d4a0: 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
d4b0: 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c  &pageSize)!=0 ||
d4c0: 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c   pageSize<512 ||
d4d0: 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45  .        (SQLITE
d4e0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33  _MAX_PAGE_SIZE<3
d4f0: 32 37 36 38 20 26 26 20 70 61 67 65 53 69 7a 65  2768 && pageSize
d500: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
d510: 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20  _SIZE).    ){.  
d520: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d530: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
d540: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
d550: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
d560: 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  );.    usableSiz
d570: 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
d580: 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
d590: 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d  ( pageSize!=pBt-
d5a0: 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
d5b0: 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64     /* After read
d5c0: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
d5d0: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
d5e0: 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61  se assuming a pa
d5f0: 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  ge size.      **
d600: 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67   of BtShared.pag
d610: 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64  eSize, we have d
d620: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74  iscovered that t
d630: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a  he page-size is.
d640: 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c        ** actuall
d650: 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f  y pageSize. Unlo
d660: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
d670: 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
d680: 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a  e1 at.      ** z
d690: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ero and return S
d6a0: 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61  QLITE_OK. The ca
d6b0: 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74  ller will call t
d6c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
d6d0: 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
d6e0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
d6f0: 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f  e-size..      */
d700: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
d710: 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
d720: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
d730: 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
d740: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
d750: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
d760: 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
d770: 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
d780: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
d790: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
d7a0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
d7b0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
d7c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d7d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
d7e0: 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20  leSize<500 ){.  
d7f0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d800: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
d810: 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
d820: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
d830: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
d840: 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
d850: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
d860: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
d870: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
d880: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
d890: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
d8a0: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
d8b0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
d8c0: 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
d8d0: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
d8e0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
d8f0: 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
d900: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
d910: 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
d920: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
d930: 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
d940: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
d950: 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
d960: 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
d970: 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
d980: 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
d990: 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
d9a0: 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
d9b0: 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
d9c0: 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
d9d0: 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
d9e0: 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
d9f0: 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
da00: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
da10: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
da20: 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
da30: 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
da40: 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
da50: 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
da60: 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
da70: 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
da80: 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
da90: 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
daa0: 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
dab0: 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72  poiner, a header
dac0: 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
dad0: 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
dae0: 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
daf0: 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
db00: 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
db10: 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
db20: 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
db30: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
db40: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >maxLocal = (pBt
db50: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
db60: 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *64/255 - 23;.  
db70: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
db80: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
db90: 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
dba0: 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
dbb0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
dbc0: 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e  ze - 35;.  pBt->
dbd0: 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e  minLeaf = (pBt->
dbe0: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
dbf0: 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73  2/255 - 23;.  as
dc00: 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
dc10: 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
dc20: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
dc30: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
dc40: 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e  pPage1;.  return
dc50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
dc60: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
dc70: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
dc80: 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
dc90: 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
dca0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
dcb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
dcc0: 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65  ks like lockBtre
dcd0: 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  e() except that 
dce0: 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20  it also invokes 
dcf0: 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c  the.** busy call
dd00: 62 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  back if there is
dd10: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
dd20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dd30: 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
dd40: 72 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b  ry(Btree *pRef){
dd50: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
dd60: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
dd70: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
dd80: 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29  ldsMutex(pRef) )
dd90: 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e  ;.  if( pRef->in
dda0: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
ddb0: 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72  E ){.    u8 inTr
ddc0: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66  ansaction = pRef
ddd0: 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
dde0: 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49  tion;.    btreeI
ddf0: 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a  ntegrity(pRef);.
de00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de10: 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
de20: 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52  pRef, 0);.    pR
de30: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
de40: 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73  action = inTrans
de50: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66  action;.    pRef
de60: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
de70: 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20  S_NONE;.    if( 
de80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
de90: 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74  .      pRef->pBt
dea0: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
deb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65  ;.    }.    btre
dec0: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
ded0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
dee0: 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a  c;.}.       ../*
def0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
df00: 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
df10: 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
df20: 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
df30: 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
df40: 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
df50: 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
df60: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
df70: 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
df80: 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
df90: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
dfa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
dfb0: 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
dfc0: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
dfd0: 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
dfe0: 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
dff0: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
e000: 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
e010: 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
e020: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
e030: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
e040: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
e050: 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
e060: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
e070: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
e080: 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
e090: 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
e0a0: 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
e0b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e0c0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
e0d0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
e0e0: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
e0f0: 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
e100: 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74  Cursor==0 && pBt
e110: 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
e120: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
e130: 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
e140: 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20  >pPager)>=1 ){. 
e150: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
e160: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
e170: 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69  );.#if 0.      i
e180: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  f( pBt->pPage1->
e190: 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  aData==0 ){.    
e1a0: 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
e1b0: 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  ge = pBt->pPage1
e1c0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
e1d0: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
e1e0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
e1f0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
e200: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74        pPage->pBt
e210: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
e220: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b  pPage->pgno = 1;
e230: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
e240: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
e250: 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
e260: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
e270: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
e280: 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
e290: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
e2a0: 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61  ate a new databa
e2b0: 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
e2c0: 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
e2d0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
e2e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e2f0: 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
e300: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
e310: 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
e320: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
e330: 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  a;.  int rc;.  i
e340: 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73  nt nPage;..  ass
e350: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e360: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
e370: 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
e380: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
e390: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
e3a0: 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
e3b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
e3c0: 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
e3d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
e3e0: 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
e3f0: 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
e400: 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
e410: 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
e420: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e430: 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
e440: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
e450: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
e460: 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
e470: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
e480: 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
e490: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e4a0: 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
e4b0: 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
e4c0: 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
e4d0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
e4e0: 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
e4f0: 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[19] = 1;.  dat
e500: 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67  a[20] = pBt->pag
e510: 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
e520: 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b  bleSize;.  data[
e530: 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
e540: 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
e550: 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
e560: 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
e570: 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
e580: 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
e590: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
e5a0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
e5b0: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
e5c0: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
e5d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e5e0: 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
e5f0: 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
e600: 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
e610: 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
e620: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
e630: 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
e640: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
e650: 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
e660: 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
e670: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
e680: 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
e690: 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
e6a0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
e6b0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
e6c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e6d0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
e6e0: 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
e6f0: 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
e700: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
e710: 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
e720: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
e730: 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
e740: 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
e750: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
e760: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
e770: 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
e780: 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
e790: 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
e7a0: 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
e7b0: 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
e7c0: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
e7d0: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
e7e0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
e7f0: 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
e800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
e810: 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
e820: 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
e830: 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
e840: 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
e850: 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
e860: 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
e870: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
e880: 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
e890: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
e8a0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
e8b0: 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
e8c0: 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
e8d0: 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
e8e0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
e8f0: 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
e900: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
e910: 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
e920: 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
e930: 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
e940: 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
e950: 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
e960: 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
e970: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
e980: 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
e990: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e9a0: 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
e9b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e9c0: 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
e9d0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e9e0: 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
e9f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
ea00: 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
ea10: 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
ea20: 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
ea30: 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
ea40: 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
ea50: 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
ea60: 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
ea70: 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
ea80: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
ea90: 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
eaa0: 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
eab0: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
eac0: 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
ead0: 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
eae0: 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
eaf0: 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
eb00: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
eb10: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
eb20: 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
eb30: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
eb40: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
eb50: 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
eb60: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
eb70: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
eb80: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
eb90: 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
eba0: 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
ebb0: 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
ebc0: 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
ebd0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
ebe0: 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
ebf0: 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
ec00: 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
ec10: 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
ec20: 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
ec30: 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
ec40: 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
ec50: 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
ec60: 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
ec70: 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
ec80: 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
ec90: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
eca0: 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
ecb0: 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
ecc0: 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
ecd0: 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
ece0: 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
ecf0: 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
ed00: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
ed10: 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
ed20: 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
ed30: 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
ed40: 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
ed50: 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
ed60: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
ed70: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
ed80: 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
ed90: 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61  wrflag){.  BtSha
eda0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
edb0: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
edc0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
edd0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
ede0: 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
edf0: 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  >db;.  btreeInte
ee00: 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
ee10: 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
ee20: 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
ee30: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
ee40: 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
ee50: 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
ee60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
ee70: 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
ee80: 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
ee90: 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
eea0: 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
eeb0: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
eec0: 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
eed0: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
eee0: 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
eef0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
ef00: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
ef10: 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
ef20: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
ef30: 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
ef40: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
ef50: 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65  */.  if( pBt->re
ef60: 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67  adOnly && wrflag
ef70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
ef80: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
ef90: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
efa0: 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  un;.  }..  /* If
efb0: 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
efc0: 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
efd0: 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
efe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
eff0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68  .  ** on this sh
f000: 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
f010: 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
f020: 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
f030: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  ion is.  ** requ
f040: 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
f050: 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a  LITE_BUSY..  */.
f060: 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
f070: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
f080: 57 52 49 54 45 20 26 26 20 77 72 66 6c 61 67 20  WRITE && wrflag 
f090: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
f0a0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
f0b0: 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
f0c0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
f0d0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f0e0: 41 43 48 45 0a 20 20 69 66 28 20 77 72 66 6c 61  ACHE.  if( wrfla
f0f0: 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
f100: 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
f110: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
f120: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
f130: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
f140: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
f150: 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
f160: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f170: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
f180: 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
f190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f1a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f    }.#endif..  do
f1b0: 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   {.    if( pBt->
f1c0: 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pPage1==0 ){.   
f1d0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72     do{.        r
f1e0: 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
f1f0: 74 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  t);.      }while
f200: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
f210: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
f220: 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  K );.    }..    
f230: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f240: 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
f250: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65       if( pBt->re
f260: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
f270: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
f280: 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
f290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
f2a0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
f2b0: 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  gin(pBt->pPage1-
f2c0: 3e 70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67  >pDbPage, wrflag
f2d0: 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >1);.        if(
f2e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f2f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
f300: 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
f310: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f320: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
f330: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f340: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
f350: 20 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69   wrflag ) pBt->i
f360: 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
f370: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  else{.      unlo
f380: 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
f390: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
f3a0: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
f3b0: 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
f3c0: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
f3d0: 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
f3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
f3f0: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
f400: 65 72 28 70 42 74 2c 20 30 29 20 29 3b 0a 0a 20  er(pBt, 0) );.. 
f410: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f420: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
f430: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
f440: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
f450: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
f460: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  +;.    }.    p->
f470: 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
f480: 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
f490: 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
f4a0: 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
f4b0: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
f4c0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
f4d0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
f4e0: 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
f4f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f500: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
f510: 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  E.    if( wrflag
f520: 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  >1 ){.      asse
f530: 72 74 28 20 21 70 42 74 2d 3e 70 45 78 63 6c 75  rt( !pBt->pExclu
f540: 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20 70 42  sive );.      pB
f550: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d 20  t->pExclusive = 
f560: 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  p;.    }.#endif.
f570: 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
f580: 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  n:.  btreeIntegr
f590: 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
f5a0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
f5b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f5c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f5d0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
f5e0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
f5f0: 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
f600: 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
f610: 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
f620: 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
f630: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
f640: 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
f650: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
f660: 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
f670: 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
f680: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
f690: 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
f6a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
f6b0: 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
f6c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
f6d0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
f700: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
f710: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
f740: 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
f750: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
f780: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
f790: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
f7a0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69  ge->pBt;.  int i
f7b0: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
f7c0: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
f7d0: 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
f7e0: 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
f7f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f800: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
f810: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
f820: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
f830: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
f840: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f850: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
f860: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
f870: 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
f880: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
f890: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
f8a0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
f8b0: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
f8c0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
f8d0: 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
f8e0: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
f8f0: 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
f900: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f910: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
f920: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
f930: 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
f940: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
f950: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
f960: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
f970: 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
f980: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
f990: 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
f9a0: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
f9b0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
f9c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
f9d0: 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
f9e0: 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
f9f0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
fa00: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
fa10: 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
fa20: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
fa30: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
fa40: 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
fa50: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
fa60: 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
fa70: 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
fa80: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f  pgno);.  }..set_
fa90: 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
faa0: 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
fab0: 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
fac0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fad0: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
fae0: 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68   on pPage, which
faf0: 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
fb00: 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  o be a btree pag
fb10: 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c  e, not an overfl
fb20: 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61  ow.** page, is a
fb30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
fb40: 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74   iFrom. Modify t
fb50: 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74  his pointer so t
fb60: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
fb70: 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74  .** iTo. Paramet
fb80: 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
fb90: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
fba0: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64  ointer to be mod
fbb0: 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f  ified, as .** fo
fbc0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
fbd0: 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
fbe0: 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
fbf0: 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
fc00: 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
fc10: 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
fc20: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
fc30: 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
fc40: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
fc50: 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
fc60: 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
fc70: 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
fc80: 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
fca0: 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
fcb0: 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
fcc0: 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
fcd0: 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
fce0: 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
fcf0: 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
fd00: 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
fd10: 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
fd20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
fd30: 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
fd40: 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
fd50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
fd60: 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
fd70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
fd80: 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
fd90: 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
fda0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fdb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
fdc0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
fdd0: 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
fde0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
fdf0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
fe00: 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
fe10: 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
fe20: 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
fe30: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
fe40: 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
fe50: 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
fe60: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
fe70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
fe80: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
fe90: 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
fea0: 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
feb0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fec0: 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d  int isInitOrig =
fed0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
fee0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
fef0: 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73  nt nCell;..    s
ff00: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
ff10: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
ff20: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
ff30: 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
ff40: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
ff50: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
ff60: 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
ff70: 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
ff80: 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
ff90: 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
ffa0: 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
ffb0: 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nfo;.        sql
ffc0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
ffd0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
ffe0: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
fff0: 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
10000 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
10010 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
10020 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
10030 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20  nfo.iOverflow]) 
10040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
10050 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
10060 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
10070 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
10080 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10090 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
100a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
100b0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
100c0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
100d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
100e0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
100f0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
10100 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
10110 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
10120 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
10130 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
10140 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
10150 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
10160 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
10170 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
10180 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
10190 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
101a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
101b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
101c0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
101d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
101e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
101f0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
10200 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
10210 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
10220 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
10230 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
10240 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
10250 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
10260 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
10270 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
10280 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
10290 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
102a0 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
102b0 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lid..*/.static i
102c0 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
102d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
102e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
102f0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
10300 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
10310 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
10320 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
10330 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
10340 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
10350 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
10360 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
10370 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
10380 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
10390 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
103a0 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
103b0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
103c0 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
103d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
103e0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
103f0 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
10400 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d   isCommit.){.  M
10410 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
10420 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
10430 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
10440 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
10450 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
10460 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
10470 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
10480 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
10490 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
104a0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
104b0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
104c0 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
104d0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
104e0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
104f0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
10500 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
10510 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
10520 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10530 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
10540 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
10550 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
10560 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
10570 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
10580 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
10590 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
105a0 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
105b0 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
105c0 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
105d0 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
105e0 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
105f0 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
10600 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
10610 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
10620 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
10630 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
10640 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
10650 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
10660 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
10670 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
10680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10690 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
106a0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
106b0 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
106c0 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
106d0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
106e0 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
106f0 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
10700 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
10710 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
10720 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
10730 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
10740 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
10750 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
10760 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
10770 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
10780 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
10790 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
107a0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
107b0 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
107c0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
107d0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
107e0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
107f0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
10800 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
10810 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
10820 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
10830 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
10840 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
10850 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
10860 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
10870 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
10880 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
10890 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
108a0 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
108b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
108c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
108d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
108e0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
108f0 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
10900 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
10910 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
10920 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
10930 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
10940 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
10950 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
10960 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
10970 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10990 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
109a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
109b0 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
109c0 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
109d0 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
109e0 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
109f0 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
10a00 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
10a10 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
10a20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
10a30 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
10a40 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
10a50 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
10a60 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
10a70 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
10a80 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
10a90 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
10aa0 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
10ab0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ac0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
10ad0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
10ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10af0 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
10b00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
10b10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10b20 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
10b30 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
10b40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
10b50 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
10b60 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
10b70 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
10b80 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
10b90 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
10ba0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
10bb0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
10bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10bd0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
10be0 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
10bf0 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
10c00 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
10c10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10c20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
10c30 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
10c40 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
10c50 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
10c60 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
10c70 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
10c80 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
10c90 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
10ca0 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
10cb0 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
10cc0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
10cd0 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
10ce0 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
10cf0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
10d00 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
10d10 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
10d20 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
10d30 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
10d40 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
10d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10d60 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
10d70 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
10d80 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
10d90 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
10da0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
10db0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
10dc0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
10dd0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
10de0 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
10df0 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
10e00 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
10e10 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
10e20 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d  zero, the implem
10e30 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73  entation assumes
10e40 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c  .** that the cal
10e50 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
10e60 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
10e70 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20  Step() until.** 
10e80 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
10e90 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72  E_DONE or an err
10ea0 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69  or, and that nFi
10eb0 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  n is the.** numb
10ec0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65 20  er of pages the 
10ed0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
10ee0 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72  ll contain after
10ef0 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73   this .** proces
10f00 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a  s is complete..*
10f10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
10f20 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
10f30 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
10f40 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c  nFin){.  Pgno iL
10f50 61 73 74 50 67 3b 20 20 20 20 20 20 20 20 20 20  astPg;          
10f60 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20     /* Last page 
10f70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
10f80 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  */.  Pgno nFreeL
10f90 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
10fa0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
10fb0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
10fc0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
10fd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10fe0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10ff0 75 74 65 78 29 20 29 3b 0a 20 20 69 4c 61 73 74  utex) );.  iLast
11000 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  Pg = pBt->nTrunc
11010 3b 0a 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d  ;.  if( iLastPg=
11020 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50  =0 ){.    iLastP
11030 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  g = pagerPagecou
11040 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
11050 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 50 54 52  .  }..  if( !PTR
11060 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
11070 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
11080 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
11090 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
110a0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75     int rc;.    u
110b0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
110c0 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
110d0 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
110e0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
110f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
11100 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
11110 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c  t==0 || nFin==iL
11120 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20 20 72  astPg ){.      r
11130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
11140 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
11150 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
11160 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
11170 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
11180 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
111a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
111b0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
111c0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
111d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
111e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
111f0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
11200 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
11210 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
11220 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
11230 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
11240 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
11250 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
11260 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
11270 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
11280 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73     ** if nFin is
11290 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
112a0 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
112b0 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
112c0 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
112d0 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
112e0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
112f0 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
11300 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
11310 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
11320 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
11330 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
11340 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
11350 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
11360 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
11370 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
11380 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
11390 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
113a0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
113b0 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
113c0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
113d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
113e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
113f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
11400 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11410 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
11420 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
11430 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
11440 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11450 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
11460 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
11470 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
11480 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
11490 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
114a0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
114b0 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20  e *pLastPg;..   
114c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
114d0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
114e0 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
114f0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
11500 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11510 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
11520 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
11530 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20       /* If nFin 
11540 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
11550 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
11560 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
11570 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
11580 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
11590 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
115a0 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
115b0 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
115c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
115d0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
115e0 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65  , if nFin is gre
115f0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
11600 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
11610 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
11620 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
11630 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
11640 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
11650 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
11660 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
11670 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
11680 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  o {.        MemP
11690 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
116a0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
116b0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
116c0 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
116d0 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eePg, 0, 0);.   
116e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
116f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11700 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
11710 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
11720 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11740 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
11750 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
11760 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20  ile( nFin!=0 && 
11770 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
11780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
11790 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
117a0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
117b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
117c0 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44  rite(pLastPg->pD
117d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
117e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
117f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11800 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
11810 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
11820 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
11830 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20  ePg, nFin!=0);. 
11840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
11850 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
11860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11880 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
118a0 20 7d 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e   }..  pBt->nTrun
118b0 63 20 3d 20 69 4c 61 73 74 50 67 20 2d 20 31 3b  c = iLastPg - 1;
118c0 0a 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e  .  while( pBt->n
118d0 54 72 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42  Trunc==PENDING_B
118e0 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
118f0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
11900 2c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29  , pBt->nTrunc) )
11910 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e  {.    pBt->nTrun
11920 63 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  c--;.  }.  retur
11930 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11940 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
11950 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
11960 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
11970 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
11980 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
11990 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
119a0 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
119b0 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
119c0 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
119d0 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
119e0 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
119f0 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
11a00 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
11a10 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
11a20 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
11a30 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
11a40 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
11a50 72 6f 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20  ror occured,.** 
11a60 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
11a70 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
11a80 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
11a90 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
11aa0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
11ab0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
11ac0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
11ad0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11ae0 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
11af0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11b00 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
11b10 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11b20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
11b30 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
11b40 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
11b50 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
11b60 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
11b70 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11b80 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
11b90 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
11ba0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
11bb0 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  (pBt);.    rc = 
11bc0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
11bd0 42 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  Bt, 0);.  }.  sq
11be0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11bf0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
11c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
11c10 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11c20 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
11c30 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
11c40 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
11c50 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
11c60 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
11c70 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
11c80 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
11c90 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
11ca0 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
11cb0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
11cc0 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
11cd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
11ce0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
11cf0 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
11d00 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
11d10 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
11d20 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
11d30 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
11d40 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
11d50 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
11d60 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
11d70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
11d80 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
11d90 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
11da0 6f 20 2a 70 6e 54 72 75 6e 63 29 7b 0a 20 20 69  o *pnTrunc){.  i
11db0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11dc0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
11dd0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
11de0 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
11df0 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
11e00 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
11e10 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65  ager) );..  asse
11e20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11e30 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
11e40 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
11e50 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
11e60 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
11e70 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
11e80 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
11e90 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
11ea0 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b    Pgno nFin = 0;
11eb0 0a 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ..    if( pBt->n
11ec0 54 72 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20  Trunc==0 ){.    
11ed0 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20    Pgno nFree;.  
11ee0 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70      Pgno nPtrmap
11ef0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  ;.      const in
11f00 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61  t pgsz = pBt->pa
11f10 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 6e  geSize;.      in
11f20 74 20 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50  t nOrig = pagerP
11f30 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
11f40 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 69 66  ager);..      if
11f50 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
11f60 70 42 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20  pBt, nOrig) ){. 
11f70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
11f80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
11f90 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
11fa0 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44   if( nOrig==PEND
11fb0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
11fc0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  t) ){.        nO
11fd0 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  rig--;.      }. 
11fe0 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74       nFree = get
11ff0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
12000 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
12010 20 20 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20        nPtrmap = 
12020 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
12030 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
12040 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28  nOrig)+pgsz/5)/(
12050 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e  pgsz/5);.      n
12060 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
12070 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
12080 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50       if( nOrig>P
12090 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
120a0 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50  (pBt) && nFin<=P
120b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
120c0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
120d0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d   nFin--;.      }
120e0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 50 54  .      while( PT
120f0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
12100 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
12110 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
12120 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
12130 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20    nFin--;.      
12140 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69  }.    }..    whi
12150 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
12160 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
12170 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
12180 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d  Bt, nFin);.    }
12190 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
121a0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
121b0 20 20 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30    assert(nFin==0
121c0 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d   || pBt->nTrunc=
121d0 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d  =0 || nFin<=pBt-
121e0 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20  >nTrunc);.      
121f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12200 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
12210 54 72 75 6e 63 20 26 26 20 6e 46 69 6e 20 29 7b  Trunc && nFin ){
12220 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12230 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
12240 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
12250 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
12260 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
12270 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
12280 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74   0);.        put
12290 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
122a0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
122b0 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
122c0 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20  nTrunc = nFin;. 
122d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
122e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
122f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
12300 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
12310 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
12320 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
12330 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12340 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e  *pnTrunc = pBt->
12350 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d  nTrunc;.    pBt-
12360 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d  >nTrunc = 0;.  }
12370 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d  .  assert( nRef=
12380 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
12390 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
123a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
123b0 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
123c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
123d0 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  TOVACUUM */../*.
123e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
123f0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
12400 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
12410 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
12420 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
12430 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
12440 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
12450 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
12460 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
12470 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
12480 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
12490 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
124a0 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
124b0 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
124c0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
124d0 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
124e0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
124f0 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
12500 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
12510 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
12520 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
12530 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
12540 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
12550 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
12560 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
12570 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
12580 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
12590 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
125a0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
125b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
125c0 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
125d0 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
125e0 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
125f0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
12600 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
12610 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
12620 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
12630 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
12640 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
12650 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
12660 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
12670 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
12680 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73  mmit() for the s
12690 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
126a0 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
126b0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
126c0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
126d0 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
126e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
126f0 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
12700 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
12710 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
12720 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
12730 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
12740 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
12750 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
12760 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
12770 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
12780 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
12790 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
127a0 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
127b0 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
127c0 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
127d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
127e0 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
127f0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
12800 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
12810 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
12820 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12830 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
12840 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
12850 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
12860 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
12870 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
12880 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
12890 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
128a0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
128b0 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
128c0 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
128d0 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
128e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
128f0 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
12900 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
12910 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
12920 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
12930 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12940 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
12950 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
12960 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
12970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12980 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
12990 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
129a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
129b0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e   p->pBt;.    Pgn
129c0 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20  o nTrunc = 0;.  
129d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
129e0 74 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d  ter(p);.    pBt-
129f0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66  >db = p->db;.#if
12a00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12a10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
12a20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
12a30 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
12a40 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
12a50 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29  it(pBt, &nTrunc)
12a60 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ; .      if( rc!
12a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
12a90 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
12aa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12ab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
12ac0 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
12ad0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
12ae0 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
12af0 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ger, zMaster, nT
12b00 72 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  runc, 0);.    sq
12b10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12b20 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
12b30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
12b40 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
12b50 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
12b60 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
12b70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12b80 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
12b90 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
12ba0 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
12bb0 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
12bc0 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
12bd0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
12be0 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
12bf0 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a  ld be invoked.**
12c00 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
12c10 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
12c20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
12c30 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20  eSync() routine 
12c40 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77  did.** all the w
12c50 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
12c60 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
12c70 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
12c80 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
12c90 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
12ca0 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
12cb0 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
12cc0 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
12cd0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
12ce0 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
12cf0 74 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c  truncate the rol
12d00 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  lback journal.**
12d10 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
12d20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
12d30 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72  o commit) and dr
12d40 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
12d50 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
12d60 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
12d70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
12d80 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
12d90 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
12da0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
12db0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
12dc0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
12dd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
12de0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
12df0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
12e00 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
12e10 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12e20 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
12e30 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
12e40 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
12e50 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
12e60 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
12e70 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
12e80 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
12e90 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
12ea0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
12eb0 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
12ec0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
12ed0 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
12ee0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
12ef0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
12f00 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
12f10 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
12f20 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
12f30 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
12f40 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
12f50 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
12f60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12f70 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
12f80 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
12f90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12fa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
12fb0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12fc0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12fd0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
12fe0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
12ff0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
13000 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
13010 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b   0;.  }.  unlock
13020 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
13030 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
13040 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f  e has any kind o
13050 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
13060 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
13070 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
13080 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
13090 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
130a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
130b0 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30   count reaches 0
130c0 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73  , set.  ** the s
130d0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
130e0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
130f0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
13100 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a  ed() call below.
13110 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b    ** will unlock
13120 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f   the pager..  */
13130 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
13140 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
13150 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
13160 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
13170 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
13180 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
13190 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
131a0 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
131b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
131c0 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73   Set the handles
131d0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
131e0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
131f0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
13200 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ock.  ** the pag
13210 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
13220 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
13230 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
13240 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
13250 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
13260 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c  RANS_NONE;.  unl
13270 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
13280 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
13290 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
132a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
132b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
132c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
132d0 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
132e0 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
132f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13300 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
13310 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
13320 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13330 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
13340 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
13350 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
13360 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13370 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
13380 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
13390 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
133a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
133b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
133c0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
133d0 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
133e0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
133f0 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
13400 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
13410 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
13420 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
13430 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
13440 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
13450 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
13460 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
13470 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ined..**.** For 
13480 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
13490 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
134a0 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
134b0 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
134c0 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
134d0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
134e0 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d  databse.  That m
134f0 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  eans the cursor 
13500 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c  was.** originall
13510 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  y opened for wri
13520 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72  ting and the cur
13530 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64  sor has not be d
13540 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61  isabled.** by ha
13550 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63  ving its state c
13560 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52  hanged to CURSOR
13570 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69  _FAULT..*/.stati
13580 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
13590 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
135a0 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
135b0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
135c0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
135d0 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
135e0 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
135f0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
13600 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
13610 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
13620 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
13630 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
13640 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
13650 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13660 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
13670 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
13680 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
13690 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
136a0 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
136b0 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
136c0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
136d0 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
136e0 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
136f0 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
13700 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
13710 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
13720 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
13730 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
13740 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
13750 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
13760 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
13770 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
13780 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
13790 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
137a0 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
137b0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
137c0 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
137d0 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
137e0 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
137f0 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
13800 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
13810 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
13820 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
13830 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
13840 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
13850 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
13860 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
13870 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
13880 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
13890 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
138a0 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
138b0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
138c0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
138d0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
138e0 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
138f0 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
13900 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69  ursor *p;.  sqli
13910 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
13920 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
13930 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
13940 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
13950 78 74 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt){.    sqlite3
13960 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
13970 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
13980 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
13990 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d  T;.    p->skip =
139a0 20 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20   errCode;.  }.  
139b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
139c0 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
139d0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
139e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
139f0 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
13a00 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
13a10 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
13a20 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
13a30 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
13a40 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
13a50 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
13a60 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
13a70 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
13a80 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
13a90 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
13aa0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
13ab0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
13ac0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
13ad0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
13ae0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
13af0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
13b00 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
13b10 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
13b20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13b30 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
13b40 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
13b50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13b60 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
13b70 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71  e *pPage1;..  sq
13b80 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13b90 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
13ba0 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 73 61  p->db;.  rc = sa
13bb0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
13bc0 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
13bd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
13be0 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
13bf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13c00 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
13c10 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
13c20 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
13c30 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
13c40 63 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20  cured whilst.   
13c50 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61   ** trying to sa
13c60 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  ve cursor positi
13c70 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ons. If this is 
13c80 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c  an automatic rol
13c90 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a  lback (as.    **
13ca0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
13cb0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c   constraint, mal
13cc0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72  loc() failure or
13cd0 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20   IO error) then 
13ce0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68  .    ** the cach
13cf0 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61  e may be interna
13d00 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  lly inconsistent
13d10 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61   (not contain va
13d20 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20  lid trees) so.  
13d30 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73    ** we cannot s
13d40 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65  imply return the
13d50 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61   error to the ca
13d60 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61  ller. Instead, a
13d70 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c  bort .    ** all
13d80 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61   queries that ma
13d90 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f  y be using any o
13da0 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
13db0 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76  at failed to sav
13dc0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
13dd0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
13de0 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b  lCursors(p, rc);
13df0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74  .  }.#endif.  bt
13e00 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
13e10 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
13e20 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  es(p);..  if( p-
13e30 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
13e40 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
13e50 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53   rc2;..#ifndef S
13e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13e70 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e  ACUUM.    pBt->n
13e80 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69  Trunc = 0;.#endi
13e90 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  f..    assert( T
13ea0 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
13eb0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
13ec0 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
13ed0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
13ee0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
13ef0 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
13f00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
13f10 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
13f20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
13f30 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
13f40 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
13f50 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
13f60 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
13f70 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
13f80 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
13f90 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
13fa0 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
13fb0 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
13fc0 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
13fd0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
13fe0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
13ff0 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
14000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14010 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
14020 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
14030 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
14040 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
14050 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
14060 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
14070 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
14080 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
14090 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
140a0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
140b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
140c0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  ;.    pBt->nTran
140d0 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
140e0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
140f0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
14100 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14110 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
14120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
14130 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
14140 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69  S_NONE;.  pBt->i
14150 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c  nStmt = 0;.  unl
14160 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
14170 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
14180 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
14190 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
141a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
141b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
141c0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
141d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68  transaction.  Th
141e0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
141f0 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72   can.** can be r
14200 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70  olled back indep
14210 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
14220 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
14230 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74  ..** You must st
14240 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
14250 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  n before startin
14260 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
14270 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72  on..** The subtr
14280 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
14290 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
142a0 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
142b0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d  nsaction.** comm
142c0 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
142d0 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e  k..**.** Only on
142e0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
142f0 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61   may be active a
14300 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73  t a time.  It is
14310 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79   an error to try
14320 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e  .** to start a n
14330 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ew subtransactio
14340 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62  n if another sub
14350 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
14360 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
14370 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
14380 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
14390 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
143a0 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
143b0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
143c0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
143d0 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
143e0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
143f0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
14400 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
14410 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
14420 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
14430 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
14440 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
14450 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
14460 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
14470 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
14480 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
14490 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
144a0 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
144b0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
144c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
144d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
144e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
144f0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
14500 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ->db;.  if( (p->
14510 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
14520 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e  RITE) || pBt->in
14530 53 74 6d 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  Stmt ){.    rc =
14540 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
14550 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
14560 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
14570 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14580 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
14590 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
145a0 57 52 49 54 45 20 29 3b 0a 20 20 20 20 72 63 20  WRITE );.    rc 
145b0 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
145c0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
145d0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
145e0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29  gin(pBt->pPager)
145f0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
14600 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 1;.  }.  sql
14610 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14620 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14630 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
14640 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75   the statment su
14650 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72  btransaction cur
14660 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
14670 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ss.  If no.** su
14680 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
14690 61 63 74 69 76 65 2c 20 74 68 69 73 20 69 73 20  active, this is 
146a0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
146b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
146c0 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  itStmt(Btree *p)
146d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
146e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
146f0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
14700 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14710 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
14720 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
14730 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
14740 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
14750 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
14760 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61  tCommit(pBt->pPa
14770 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
14780 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14790 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e  K;.  }.  pBt->in
147a0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Stmt = 0;.  sqli
147b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
147c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
147d0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
147e0 20 74 68 65 20 61 63 74 69 76 65 20 73 74 61 74   the active stat
147f0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
14800 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62  tion.  If no sub
14810 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
14820 73 20 61 63 74 69 76 65 20 74 68 69 73 20 72 6f  s active this ro
14830 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
14840 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  ..**.** All curs
14850 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
14860 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20  lidated by this 
14870 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
14880 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73  attempt.** to us
14890 65 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  e a cursor that 
148a0 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
148b0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
148c0 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77  s operation.** w
148d0 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
148e0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
148f0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
14900 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ackStmt(Btree *p
14910 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14920 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
14930 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
14940 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
14950 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
14960 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
14970 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  if( pBt->inStmt 
14980 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
14990 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  y ){.    rc = sq
149a0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f  lite3PagerStmtRo
149b0 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
149c0 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  er);.    pBt->in
149d0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
149e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
149f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14a00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
14a10 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
14a20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
14a30 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
14a40 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
14a50 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61  e.  The act of a
14a60 63 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f  cquiring a curso
14a70 72 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f  r gets a read lo
14a80 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61  ck on .** the da
14a90 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
14aa0 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
14ab0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
14ac0 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
14ad0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
14ae0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
14af0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
14b00 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
14b10 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
14b20 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
14b30 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
14b40 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
14b50 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
14b60 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
14b70 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
14b80 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
14b90 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
14ba0 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
14bb0 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
14bc0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
14bd0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
14be0 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
14bf0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
14c00 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
14c10 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
14c20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
14c30 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
14c40 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
14c50 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
14c60 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
14c70 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
14c80 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
14c90 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
14ca0 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
14cb0 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
14cc0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
14cd0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
14ce0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
14cf0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
14d00 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
14d10 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
14d20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
14d30 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
14d40 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
14d50 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
14d60 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
14d70 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
14d80 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
14d90 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
14da0 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
14db0 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
14dc0 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
14dd0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
14de0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
14df0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
14e00 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
14e10 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
14e20 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
14e30 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
14e40 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
14e50 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
14e60 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
14e70 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20 6d  ize() bytes of m
14e80 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65  emory .** pointe
14e90 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61 76  d to by pCur hav
14ea0 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  e been zeroed by
14eb0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
14ec0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
14ed0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
14ee0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
14f10 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
14f40 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
14f50 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
14f60 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
14f90 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
14fa0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
14fb0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
14fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
14fd0 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
14fe0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
14ff0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
15000 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
15010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
15020 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
15030 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  or */.){.  int r
15040 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
15050 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
15060 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
15070 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
15080 29 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61  ) );.  if( wrFla
15090 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  g ){.    if( pBt
150a0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
150b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
150c0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
150d0 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52  }.    if( checkR
150e0 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62  eadLocks(p, iTab
150f0 6c 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  le, 0, 0) ){.   
15100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15110 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  _LOCKED;.    }. 
15120 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
15130 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
15140 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69  rc = lockBtreeWi
15150 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20  thRetry(p);.    
15160 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15170 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
15180 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
15190 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
151a0 79 20 26 26 20 77 72 46 6c 61 67 20 29 7b 0a 20  y && wrFlag ){. 
151b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
151c0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
151d0 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70   }.  }.  pCur->p
151e0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
151f0 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54  iTable;.  if( iT
15200 61 62 6c 65 3d 3d 31 20 26 26 20 70 61 67 65 72  able==1 && pager
15210 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
15220 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  Pager)==0 ){.   
15230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50   rc = SQLITE_EMP
15240 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65  TY;.    goto cre
15250 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
15260 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tion;.  }.  rc =
15270 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
15280 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
15290 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
152a0 67 65 5b 30 5d 29 3b 0a 20 20 69 66 28 20 72 63  ge[0]);.  if( rc
152b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
152c0 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
152d0 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
152e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
152f0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
15300 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
15310 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
15320 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
15330 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69  ** variables, li
15340 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
15350 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
15360 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70  list and set *pp
15370 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75  Cur (the.  ** ou
15380 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  tput argument to
15390 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e   this function).
153a0 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b  .  */.  pCur->pK
153b0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
153c0 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
153d0 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
153e0 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
153f0 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61  ->wrFlag = wrFla
15400 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
15410 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
15420 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
15430 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
15440 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
15450 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
15460 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
15470 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
15480 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
15490 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
154a0 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75  E_OK;..create_cu
154b0 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a  rsor_exception:.
154c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
154d0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
154e0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
154f0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65  nused(pBt);.  re
15500 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
15510 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
15520 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
15560 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15590 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
155a0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
155b0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155e0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
155f0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
15600 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
15610 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
15620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
15630 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
15640 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
15650 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15670 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
15680 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
15690 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
156a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
156b0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
156c0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
156d0 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
156e0 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
156f0 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
15700 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
15710 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15720 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
15730 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
15740 72 53 69 7a 65 28 29 7b 0a 20 20 72 65 74 75 72  rSize(){.  retur
15750 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  n sizeof(BtCurso
15760 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43  r);.}..../*.** C
15770 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
15780 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
15790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
157a0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
157b0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
157c0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
157d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
157e0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
157f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
15800 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
15810 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
15820 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
15830 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
15840 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15850 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
15860 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15870 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70  r(pBtree);.    p
15880 42 74 2d 3e 64 62 20 3d 20 70 42 74 72 65 65 2d  Bt->db = pBtree-
15890 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >db;.    sqlite3
158a0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
158b0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
158c0 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
158d0 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76       pCur->pPrev
158e0 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
158f0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
15900 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
15910 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
15920 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
15930 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
15940 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  .      pCur->pNe
15950 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
15960 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20  ->pPrev;.    }. 
15970 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
15980 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
15990 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
159a0 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
159b0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
159c0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
159d0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e  sed(pBt);.    in
159e0 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
159f0 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20  Cache(pCur);.   
15a00 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
15a10 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
15a20 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15a30 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
15a40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
15a60 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
15a70 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e  or by filling in
15a80 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70   the fields of p
15a90 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20  TempCur..** The 
15aa0 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
15ab0 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
15ac0 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74  ursor list for t
15ad0 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  he Btree..*/.voi
15ae0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  d sqlite3BtreeGe
15af0 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  tTempCursor(BtCu
15b00 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75  rsor *pCur, BtCu
15b10 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b  rsor *pTempCur){
15b20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
15b30 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
15b40 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
15b50 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c  memcpy(pTempCur,
15b60 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 42 74   pCur, sizeof(Bt
15b70 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d  Cursor));.  pTem
15b80 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pCur->pNext = 0;
15b90 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72  .  pTempCur->pPr
15ba0 65 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ev = 0;.  for(i=
15bb0 30 3b 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e  0; i<=pTempCur->
15bc0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
15bd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
15be0 28 70 54 65 6d 70 43 75 72 2d 3e 61 70 50 61 67  (pTempCur->apPag
15bf0 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a  e[i]->pDbPage);.
15c00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
15c10 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ete a temporary 
15c20 63 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77  cursor such as w
15c30 61 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43  as made by the C
15c40 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75  reateTemporaryCu
15c50 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rsor().** functi
15c60 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69  on above..*/.voi
15c70 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65  d sqlite3BtreeRe
15c80 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28  leaseTempCursor(
15c90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
15ca0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
15cb0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
15cc0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
15cd0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
15ce0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
15cf0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
15d00 6e 72 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67  nref(pCur->apPag
15d10 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a  e[i]->pDbPage);.
15d20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
15d30 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72  e sure the BtCur
15d40 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  sor* given in th
15d50 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  e argument has a
15d60 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73   valid.** BtCurs
15d70 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72  or.info structur
15d80 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
15d90 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
15da0 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42  call.** sqlite3B
15db0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
15dc0 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
15dd0 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
15de0 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
15df0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
15e00 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
15e10 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
15e20 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
15e30 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
15e40 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
15e50 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
15e60 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
15e70 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
15e80 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
15e90 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
15ea0 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
15eb0 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
15ec0 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
15ed0 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
15ee0 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
15ef0 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
15f00 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
15f10 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
15f20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
15f30 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
15f40 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
15f50 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
15f60 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
15f70 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
15f80 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
15f90 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20  doing agressive 
15fa0 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77  inlining.)  So w
15fb0 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e  e use a real fun
15fc0 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56  ction.** for MSV
15fd0 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f  C and a macro fo
15fe0 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  r everything els
15ff0 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37  e.  Ticket #2457
16000 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
16010 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
16020 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  d assertCellInfo
16030 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
16040 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
16050 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61  nfo;.    int iPa
16060 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
16070 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e  ;.    memset(&in
16080 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e  fo, 0, sizeof(in
16090 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  fo));.    sqlite
160a0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
160b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
160c0 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
160d0 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
160e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
160f0 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
16100 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
16110 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
16120 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
16130 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
16140 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
16150 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73  _MSC_VER.  /* Us
16160 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
16170 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72  n in MSVC to wor
16180 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e  k around bugs in
16190 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20   that compiler. 
161a0 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
161b0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
161c0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
161d0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
161e0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
161f0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
16200 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
16210 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
16220 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
16230 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
16240 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
16250 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
16260 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
16270 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ey = 1;.    }els
16280 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43  e{.      assertC
16290 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
162a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f     }.  }.#else /
162b0 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45  * if not _MSC_VE
162c0 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20  R */.  /* Use a 
162d0 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68  macro in all oth
162e0 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20  er compilers so 
162f0 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
16300 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a  n is inlined */.
16310 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49  #define getCellI
16320 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20  nfo(pCur)       
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
16360 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
16370 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20  o.nSize==0 ){   
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  \.    int iPage 
163c0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20  = pCur->iPage;  
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16400 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   \.    sqlite3Bt
16410 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
16420 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
16430 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
16440 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
16450 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61  ; \.    pCur->va
16460 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20  lidNKey = 1;    
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164f0 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
16500 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16540 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
16550 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
16560 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
16570 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
16580 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
16590 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
165a0 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
165b0 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
165c0 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
165d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
165e0 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
165f0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
16600 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
16610 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
16620 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
16630 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
16640 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
16650 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
16660 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
16670 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16680 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69  in the key..*/.i
16690 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
166a0 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
166b0 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
166c0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
166d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
166e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
166f0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
16700 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
16710 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
16720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16730 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
16740 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
16750 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
16760 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
16770 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
16780 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
16790 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
167a0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
167b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
167c0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
167d0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
167e0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
167f0 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
16800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16810 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
16820 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
16830 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
16840 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
16850 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
16860 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ntly points to. 
16870 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53   Always return S
16880 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69  QLITE_OK..** Fai
16890 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
168a0 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75  ible.  If the cu
168b0 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72  rsor is not curr
168c0 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ently.** pointin
168d0 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77  g to an entry (w
168e0 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c  hich can happen,
168f0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   for example, if
16900 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
16910 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20   is empty) then 
16920 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
16930 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
16940 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
16950 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
16960 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  u32 *pSize){.  i
16970 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
16980 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
16990 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
169a0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
169b0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
169c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
169d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
169e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
169f0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
16a00 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
16a10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
16a20 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
16a30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
16a40 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  VALID ){.      /
16a50 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  * Not pointing a
16a60 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  t a valid entry 
16a70 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  - set *pSize to 
16a80 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69  0. */.      *pSi
16a90 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
16aa0 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
16ab0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
16ac0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
16ad0 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20  >info.nData;.   
16ae0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16af0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
16b00 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
16b10 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
16b20 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
16b30 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
16b40 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
16b50 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
16b60 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
16b70 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
16b80 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
16b90 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
16ba0 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
16bb0 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
16bc0 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
16bd0 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
16be0 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
16bf0 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
16c00 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
16c10 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
16c20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
16c30 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
16c40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
16c50 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
16c60 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50  .**.** Unless pP
16c70 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c  gnoNext is NULL,
16c80 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16c90 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
16ca0 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69  rflow .** page i
16cb0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
16cc0 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
16cd0 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
16ce0 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74  age ovfl.** is t
16cf0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
16d00 69 74 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c  its linked list,
16d10 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
16d20 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
16d30 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
16d40 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67  not NULL, *ppPag
16d50 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
16d60 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a  MemPage* handle.
16d70 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c  ** for page ovfl
16d80 2e 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  . The underlying
16d90 20 70 61 67 65 72 20 70 61 67 65 20 6d 61 79 20   pager page may 
16da0 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
16db0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
16dc0 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73  noContent flag s
16dd0 65 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20  et, so the page 
16de0 64 61 74 61 20 61 63 63 65 73 73 61 62 6c 65 20  data accessable 
16df0 76 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64  via.** this hand
16e00 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  le may not be tr
16e10 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  usted..*/.static
16e20 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
16e30 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
16e40 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f   *pBt, .  Pgno o
16e50 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
16e60 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c         /* Overfl
16e70 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d  ow page */.  Mem
16e80 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
16e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16ea0 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
16eb0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
16ec0 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
16ed0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
16ee0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
16ef0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
16f00 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e  o next = 0;.  in
16f10 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
16f20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16f30 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
16f40 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  );.  /* One of t
16f50 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65  hese must not be
16f60 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
16f70 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20  , why call this 
16f80 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61  function? */.  a
16f90 73 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20  ssert(ppPage || 
16fa0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f  pPgnoNext);..  /
16fb0 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69  * If pPgnoNext i
16fc0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
16fd0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  s function is be
16fe0 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62  ing called to ob
16ff0 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50  tain.  ** a MemP
17000 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f  age* reference o
17010 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74  nly. No page-dat
17020 61 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  a is required in
17030 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f   this case..  */
17040 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78  .  if( !pPgnoNex
17050 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
17060 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
17070 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70  age(pBt, ovfl, p
17080 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a  pPage, 1);.  }..
17090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
170a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
170b0 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
170c0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
170d0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
170e0 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
170f0 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
17100 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
17110 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
17120 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
17130 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
17140 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
17150 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
17160 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
17170 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
17180 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
17190 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
171a0 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
171b0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
171c0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
171d0 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
171e0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
171f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
17200 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
17210 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
17220 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
17230 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
17240 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
17250 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
17260 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
17270 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
17280 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
17290 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
172a0 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72  f( iGuess<=pager
172b0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
172c0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
172d0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
172e0 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
172f0 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
17300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17320 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17330 7d 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  }.      if( eTyp
17340 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
17350 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
17360 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
17370 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
17380 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
17390 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74  ndif..  if( next
173a0 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b  ==0 || ppPage ){
173b0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
173c0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63  age = 0;..    rc
173d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
173e0 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
173f0 2c 20 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d  , &pPage, next!=
17400 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72  0);.    assert(r
17410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
17420 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69  pPage==0);.    i
17430 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63  f( next==0 && rc
17440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17450 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
17460 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
17470 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  a);.    }..    i
17480 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
17490 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
174a0 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ge;.    }else{. 
174b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
174c0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
174d0 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20   }.  *pPgnoNext 
174e0 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72  = next;..  retur
174f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
17500 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
17510 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
17520 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
17530 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
17540 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
17550 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
17560 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
17570 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
17580 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
17590 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
175a0 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
175b0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
175c0 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
175d0 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
175e0 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
175f0 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
17600 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
17610 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
17620 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
17630 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
17640 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
17650 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
17660 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
17670 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
17680 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
17690 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
176a0 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
176b0 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
176c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
176d0 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
176e0 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
176f0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
17700 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
17710 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
17720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17730 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
17740 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
17750 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
17760 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17770 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
17780 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
177a0 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
177b0 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
177c0 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
177d0 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
177e0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
177f0 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
17800 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
17810 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
17820 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
17830 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
17840 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
17850 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
17860 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
17870 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
17880 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17890 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
178a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
178b0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
178c0 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
178d0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
178e0 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
178f0 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
17900 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
17910 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
17920 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
17930 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
17940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17950 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
17960 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
17970 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
17980 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
17990 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
179a0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
179b0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
179c0 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65  nting to. If the
179d0 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65   eOp.** paramete
179e0 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  r is 0, this is 
179f0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
17a00 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e   (data copied in
17a10 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
17a20 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e  f). If it is non
17a30 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28  -zero, a write (
17a40 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d  data copied from
17a50 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
17a60 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
17a70 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
17a80 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
17a90 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
17aa0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
17ab0 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
17ac0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
17ad0 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pBuf..**.** This
17ae0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
17af0 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63  t make a distinc
17b00 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79  tion between key
17b10 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74   and data..** It
17b20 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77   just reads or w
17b30 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d  rites bytes from
17b40 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65   the payload are
17b50 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a  a.  Data might .
17b60 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ** appear on the
17b70 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65   main page or be
17b80 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
17b90 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
17ba0 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a  low .** pages..*
17bb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75  *.** If the BtCu
17bc0 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48  rsor.isIncrblobH
17bd0 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
17be0 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  t, and the curre
17bf0 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74  nt.** cursor ent
17c00 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
17c10 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
17c20 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  es, this functio
17c30 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73  n.** allocates s
17c40 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
17c50 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68  ily popluates th
17c60 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
17c70 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61  list .** cache a
17c80 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
17c90 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65  Overflow). Subse
17ca0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
17cb0 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f  this.** cache to
17cc0 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
17cd0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
17ce0 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69  fset more effici
17cf0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
17d00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
17d10 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
17d20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
17d30 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
17d40 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
17d50 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
17d60 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
17d70 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
17d80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
17d90 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
17da0 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
17db0 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
17dc0 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
17dd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
17de0 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
17df0 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
17e00 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
17e10 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
17e20 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
17e30 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
17e40 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
17e50 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
17e60 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
17e70 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
17e80 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
17e90 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
17ea0 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
17eb0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
17ec0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
17ed0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
17ee0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
17ef0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
17f00 74 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  t offset,       
17f10 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
17f20 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
17f30 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69  o payload */.  i
17f40 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
17f50 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
17f60 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
17f70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17f80 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
17f90 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
17fa0 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
17fb0 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20  int skipKey,    
17fc0 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62       /* offset b
17fd0 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66  egins at data if
17fe0 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
17ff0 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
18000 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
18010 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
18020 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
18030 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
18040 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
18050 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18060 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
18070 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
18080 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
18090 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
180a0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
180b0 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
180c0 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
180d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18100 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
18110 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
18120 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
18140 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18150 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
18160 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
18170 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
18180 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
18190 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
181a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
181b0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
181c0 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
181d0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
181e0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
181f0 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
18200 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
18210 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50  er;.  nKey = (pP
18220 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20  age->intKey ? 0 
18230 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  : pCur->info.nKe
18240 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b  y);..  if( skipK
18250 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74  ey ){.    offset
18260 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20   += nKey;.  }.  
18270 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e  if( offset+amt >
18280 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
18290 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a  .nData ){.    /*
182a0 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
182b0 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
182c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
182d0 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
182e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
182f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18300 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
18310 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
18320 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
18330 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
18340 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
18350 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
18360 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
18370 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
18380 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
18390 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
183a0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
183b0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
183c0 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
183d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
183e0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
183f0 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
18400 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65  f, a, eOp, pPage
18410 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
18420 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
18430 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
18440 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
18450 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
18460 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
18470 6c 3b 0a 20 20 7d 0a 0a 20 20 70 42 74 20 3d 20  l;.  }..  pBt = 
18480 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 69 66 28  pCur->pBt;.  if(
18490 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
184a0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
184b0 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a  onst int ovflSiz
184c0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
184d0 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
184e0 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
184f0 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
18500 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
18510 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
18520 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
18530 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
18540 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
18550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
18560 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
18570 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
18580 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
18590 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
185a0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
185b0 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
185c0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
185d0 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
185e0 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
185f0 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
18600 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
18610 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
18620 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
18630 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
18640 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
18650 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
18660 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
18670 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
18680 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
18690 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
186a0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
186b0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
186c0 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
186d0 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
186e0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
186f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
18700 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
18710 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
18720 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
18730 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
18740 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
18750 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
18760 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
18770 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
18780 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18790 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
187a0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
187b0 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
187c0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
187d0 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  l && !pCur->aOve
187e0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
187f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18800 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
18810 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
18820 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
18830 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
18840 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
18850 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
18860 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
18870 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
18880 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
18890 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
188a0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
188b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
188c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
188d0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
188e0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
188f0 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
18900 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
18910 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
18920 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
18930 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
18940 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
18950 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
18960 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66   }.#endif..    f
18970 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
18980 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
18990 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
189a0 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ){..#ifndef SQLI
189b0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
189c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
189d0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
189e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
189f0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
18a00 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
18a10 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
18a20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
18a30 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18a40 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
18a50 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
18a60 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
18a70 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18a80 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
18a90 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  e;.      }.#endi
18aa0 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  f..      if( off
18ab0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
18ac0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
18ad0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
18ae0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
18af0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
18b00 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
18b10 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
18b20 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
18b30 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
18b40 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
18b50 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
18b60 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
18b70 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
18b80 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
18b90 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
18ba0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
18bb0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
18bc0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
18bd0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
18be0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
18bf0 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
18c00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
18c10 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
18c20 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
18c30 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
18c40 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
18c50 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
18c60 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
18c70 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
18c80 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
18c90 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
18ca0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
18cb0 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
18cc0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
18cd0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
18ce0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
18cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18d00 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
18d10 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
18d20 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
18d30 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
18d40 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
18d50 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
18d60 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
18d70 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
18d80 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
18d90 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61   */.        DbPa
18da0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
18db0 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
18dc0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
18dd0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
18de0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
18df0 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
18e00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
18e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18e20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
18e30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
18e40 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
18e50 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
18e60 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
18e70 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
18e80 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
18e90 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
18ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d  .            a =
18eb0 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
18ec0 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  et;.          }.
18ed0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
18ee0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
18ef0 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
18f00 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
18f10 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
18f20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
18f30 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
18f40 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
18f50 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d   0;.          am
18f60 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
18f70 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
18f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18f90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
18fa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18fb0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
18fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18fd0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
18fe0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18ff0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
19000 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
19010 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
19020 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
19030 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
19040 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
19050 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
19060 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
19070 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
19080 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
19090 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
190a0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
190b0 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
190c0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
190d0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
190e0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
190f0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
19100 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
19110 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
19120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19130 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
19140 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
19150 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
19160 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
19170 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
19180 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19190 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
191a0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
191b0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
191c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
191d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
191e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
191f0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
19200 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
19210 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
19220 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
19230 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  age] );.    if( 
19240 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
19250 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
19260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19270 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
19280 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
19290 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
192a0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
192b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
192c0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
192d0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
192e0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
192f0 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
19300 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30  char*)pBuf, 0, 0
19310 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19320 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
19330 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
19340 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
19350 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
19360 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
19370 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
19380 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
19390 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
193a0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
193b0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
193c0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
193d0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
193e0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
193f0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
19400 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
19410 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
19420 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
19430 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
19440 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
19450 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
19460 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
19470 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
19480 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
19490 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
194a0 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
194b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
194c0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
194d0 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
194e0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
194f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
19500 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
19510 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
19520 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19530 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
19540 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
19550 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
19560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19570 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
19580 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
19590 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
195a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
195b0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
195c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
195d0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
195e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
195f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
19600 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
19610 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
19620 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
19630 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
19640 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
19650 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  Buf, 1, 0);.  }.
19660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19670 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
19680 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
19690 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
196a0 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
196b0 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
196c0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
196d0 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
196e0 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
196f0 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
19700 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
19710 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
19720 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
19730 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
19740 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
19750 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19760 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
19770 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
19780 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
19790 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
197a0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
197b0 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
197c0 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
197d0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
197e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
197f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
19800 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
19810 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
19820 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
19830 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
19840 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
19850 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
19860 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
19870 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
19880 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
19890 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
198a0 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
198b0 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
198c0 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
198d0 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
198e0 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
198f0 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
19900 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
19910 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
19920 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
19930 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mbly.** the key/
19940 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
19950 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
19960 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
19970 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
19980 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
19990 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
199a0 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
199b0 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
199c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
199d0 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
199e0 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
199f0 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
19a00 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
19a10 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
19a20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
19a30 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
19a40 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
19a50 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
19a60 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
19a70 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
19a80 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
19a90 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
19aa0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
19ab0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
19ac0 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
19ad0 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
19ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
19af0 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
19b00 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
19b10 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
19b20 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
19b30 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
19b40 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
19b50 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b  y;.  int nLocal;
19b60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
19b70 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
19b80 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
19b90 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
19ba0 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
19bb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19bc0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
19bd0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19be0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19bf0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
19c00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
19c10 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
19c20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
19c30 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
19c40 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65  nCell );.  getCe
19c50 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
19c60 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
19c70 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
19c80 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
19c90 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
19ca0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
19cb0 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
19cc0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
19cd0 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e   nKey = pCur->in
19ce0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  fo.nKey;.  }.  i
19cf0 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
19d00 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    aPayload += nK
19d10 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  ey;.    nLocal =
19d20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
19d30 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c  al - nKey;.  }el
19d40 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
19d50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
19d60 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63  al;.    if( nLoc
19d70 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  al>nKey ){.     
19d80 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a   nLocal = nKey;.
19d90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d      }.  }.  *pAm
19da0 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65  t = nLocal;.  re
19db0 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d  turn aPayload;.}
19dc0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
19dd0 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
19de0 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
19df0 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
19e00 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
19e10 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
19e20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
19e30 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
19e40 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
19e50 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
19e60 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
19e70 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
19e80 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
19e90 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
19ea0 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
19eb0 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
19ec0 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
19ed0 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
19ee0 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
19ef0 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
19f00 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
19f10 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
19f20 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
19f30 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
19f40 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
19f50 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
19f60 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
19f70 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
19f80 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
19f90 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
19fa0 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
19fb0 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
19fc0 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
19fd0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
19fe0 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
19ff0 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
1a000 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
1a010 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
1a020 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
1a030 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
1a040 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1a050 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1a060 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
1a070 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a080 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
1a090 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
1a0a0 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1a0b0 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
1a0c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1a0d0 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
1a0e0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
1a0f0 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1a100 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1a110 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a120 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a130 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1a140 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a150 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
1a160 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29  rn (const void*)
1a170 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1a180 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
1a190 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1a1a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1a1b0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
1a1c0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
1a1d0 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
1a1e0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
1a1f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1a200 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
1a210 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74  o move to..*/.st
1a220 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
1a230 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
1a240 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
1a250 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1a260 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61  nt i = pCur->iPa
1a270 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
1a280 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61  NewPage;.  BtSha
1a290 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1a2a0 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
1a2b0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1a2c0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1a2d0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1a2e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1a2f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1a300 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
1a310 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
1a320 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
1a330 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
1a340 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
1a350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1a360 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1a370 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
1a380 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
1a390 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a  no, &pNewPage);.
1a3a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1a3b0 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70  n rc;.  pCur->ap
1a3c0 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77  Page[i+1] = pNew
1a3d0 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69  Page;.  pCur->ai
1a3e0 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  Idx[i+1] = 0;.  
1a3f0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a  pCur->iPage++;..
1a400 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1a410 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
1a420 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1a430 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
1a440 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65  Cell<1 ){.    re
1a450 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1a460 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
1a470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a480 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
1a490 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  BUG./*.** Page p
1a4a0 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
1a4b0 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
1a4c0 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
1a4d0 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
1a4e0 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
1a4f0 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
1a500 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
1a510 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
1a520 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
1a530 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
1a540 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
1a550 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1a560 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
1a570 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
1a580 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
1a590 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
1a5a0 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
1a5b0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
1a5c0 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
1a5d0 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
1a5e0 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
1a5f0 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
1a600 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
1a610 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
1a620 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
1a630 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
1a640 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
1a650 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
1a660 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
1a670 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
1a680 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
1a690 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
1a6a0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1a6b0 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
1a6c0 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
1a6d0 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
1a6e0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
1a6f0 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
1a700 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1a710 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
1a720 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
1a730 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
1a740 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
1a750 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
1a760 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
1a770 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
1a780 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
1a790 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
1a7a0 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
1a7b0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
1a7c0 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
1a7d0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
1a7e0 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
1a7f0 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
1a800 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  l index..*/.void
1a810 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1a820 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
1a830 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
1a840 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1a850 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1a860 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1a870 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1a880 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1a890 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
1a8a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1a8b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1a8c0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
1a8d0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
1a8e0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
1a8f0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
1a900 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1a910 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
1a920 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
1a930 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1a940 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65  pgno.  );.  rele
1a950 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1a960 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1a970 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  ]);.  pCur->iPag
1a980 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  e--;.  pCur->inf
1a990 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1a9a0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1a9b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76   0;.}../*.** Mov
1a9c0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1a9d0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f  the root page.*/
1a9e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1a9f0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
1aa00 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
1aa10 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
1aa20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1aa30 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
1aa40 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
1aa50 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1aa60 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
1aa70 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1aa80 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1aa90 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
1aaa0 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
1aab0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
1aac0 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
1aad0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
1aae0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
1aaf0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
1ab00 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
1ab10 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
1ab20 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
1ab30 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
1ab40 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
1ab50 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1ab60 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
1ab70 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
1ab80 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  skip;.    }.    
1ab90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1aba0 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
1abb0 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
1abc0 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
1abd0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
1abe0 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =1; i<=pCur->iPa
1abf0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1ac00 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1ac10 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1ac20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1ac30 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49   if( .      SQLI
1ac40 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74  TE_OK!=(rc = get
1ac50 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
1ac60 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
1ac70 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
1ac80 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ])).    ){.     
1ac90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1aca0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1acb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1acc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52  .    }.  }..  pR
1acd0 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
1ace0 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
1acf0 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
1ad00 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
1ad10 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
1ad20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  0;.  pCur->aiIdx
1ad30 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  [0] = 0;.  pCur-
1ad40 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1ad50 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
1ad60 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1ad70 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69  idNKey = 0;..  i
1ad80 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d  f( pRoot->nCell=
1ad90 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65  =0 && !pRoot->le
1ada0 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
1adb0 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65  ubpage;.    asse
1adc0 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
1add0 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67  =1 );.    subpag
1ade0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
1adf0 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
1ae00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1ae10 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75 62  .    assert( sub
1ae20 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43  page>0 );.    pC
1ae30 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1ae40 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
1ae50 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1ae60 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
1ae70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
1ae80 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52  r->eState = ((pR
1ae90 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55  oot->nCell>0)?CU
1aea0 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f  RSOR_VALID:CURSO
1aeb0 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a  R_INVALID);.  }.
1aec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1aed0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1aee0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
1aef0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
1af00 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1af10 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
1af20 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
1af30 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
1af40 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
1af50 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
1af60 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
1af70 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
1af80 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
1af90 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
1afa0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1afb0 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
1afc0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
1afd0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
1afe0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
1aff0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1b000 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1b010 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1b020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1b030 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b040 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
1b050 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1b060 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
1b070 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1b080 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
1b090 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b0a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1b0b0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1b0c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
1b0d0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
1b0e0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
1b0f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1b100 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
1b110 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1b120 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
1b130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b140 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1b150 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
1b160 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
1b170 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1b180 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
1b190 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
1b1a0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
1b1b0 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
1b1c0 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
1b1d0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
1b1e0 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
1b1f0 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
1b200 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
1b210 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
1b220 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1b230 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
1b240 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
1b250 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
1b260 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
1b270 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
1b280 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
1b290 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
1b2a0 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
1b2b0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
1b2c0 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
1b2d0 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
1b2e0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
1b2f0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
1b300 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
1b310 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
1b320 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
1b330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
1b340 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1b350 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1b360 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1b370 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1b380 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1b390 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
1b3a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b3b0 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
1b3c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1b3d0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
1b3e0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1b3f0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1b400 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1b410 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
1b420 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1b430 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
1b440 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
1b450 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1b460 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
1b470 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b480 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
1b490 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
1b4a0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1b4b0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1b4c0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1b4d0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1b4e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1b4f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1b500 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1b510 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1b520 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1b530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1b540 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1b550 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1b560 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1b570 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1b580 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1b590 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1b5a0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1b5b0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1b5c0 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
1b5d0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1b5e0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1b5f0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1b600 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1b610 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1b620 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1b630 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1b640 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1b650 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1b660 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1b670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b680 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1b690 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1b6a0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1b6b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1b6c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1b6d0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
1b6e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1b6f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b700 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1b710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b720 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1b730 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
1b740 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1b750 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1b760 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1b770 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1b780 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b790 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1b7a0 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
1b7b0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1b7c0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1b7d0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1b7e0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1b7f0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1b800 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1b810 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1b820 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1b830 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1b840 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1b850 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
1b860 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
1b870 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1b880 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
1b890 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1b8a0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1b8b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b8c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1b8d0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1b8e0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1b8f0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1b900 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1b910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1b920 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1b930 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1b940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b950 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1b960 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
1b970 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
1b980 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
1b990 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b9a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1b9b0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1b9c0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1b9d0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1b9e0 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1b9f0 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1ba00 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1ba10 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72  pCur->atLast = r
1ba20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  c==SQLITE_OK;.  
1ba30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ba40 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
1ba50 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
1ba60 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1ba70 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
1ba80 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
1ba90 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
1baa0 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
1bab0 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
1bac0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
1bad0 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
1bae0 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
1baf0 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
1bb00 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
1bb10 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
1bb20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
1bb30 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
1bb40 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
1bb50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
1bb60 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
1bb70 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
1bb80 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
1bb90 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
1bba0 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
1bbb0 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
1bbc0 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
1bbd0 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
1bbe0 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
1bbf0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
1bc00 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
1bc10 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
1bc20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
1bc30 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  *.** The result 
1bc40 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  of comparing the
1bc50 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
1bc60 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
1bc70 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72  .** cursor is wr
1bc80 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69  itten to *pRes i
1bc90 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54  f pRes!=NULL.  T
1bca0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a  he meaning of.**
1bcb0 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 61   this value is a
1bcc0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1bcd0 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
1bce0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1bcf0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1bd00 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1bd10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1bd20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
1bd30 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68  an pKey or if th
1bd40 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1bd50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1bd60 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
1bd70 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
1bd80 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
1bd90 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
1bda0 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
1bdb0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1bdc0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1bdd0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
1be00 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  pKey..**.**     
1be10 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
1be20 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1be30 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1be40 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1be60 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65   larger than pKe
1be70 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
1be80 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
1be90 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
1bea0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1beb0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1bec0 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
1bed0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1bee0 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
1bef0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1bf00 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
1bf10 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
1bf20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
1bf30 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
1bf40 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
1bf50 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
1bf60 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
1bf70 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
1bf80 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
1bf90 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1bfa0 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
1bfb0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1bfc0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1bfd0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1bfe0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1bff0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1c000 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1c010 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1c020 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1c030 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
1c040 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
1c050 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
1c060 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
1c070 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
1c080 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
1c090 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
1c0a0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
1c0b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c0c0 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76  VALID && pCur->v
1c0d0 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20  alidNKey .   && 
1c0e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
1c0f0 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20  >intKey .  ){.  
1c100 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1c110 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
1c120 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1c130 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c150 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74      if( pCur->at
1c160 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e  Last && pCur->in
1c170 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
1c180 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
1c190 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1c1a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c1b0 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  }.  }..  rc = mo
1c1c0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1c1d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1c1e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1c1f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1c200 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1c210 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
1c220 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1c230 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
1c240 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  t );.  if( pCur-
1c250 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c260 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
1c270 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
1c280 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1c290 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c2a0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1c2b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c2c0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1c2d0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
1c2e0 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64  ]->intKey || pId
1c2f0 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
1c300 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
1c310 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  upr;.    Pgno ch
1c320 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
1c330 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
1c340 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1c350 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20  age];.    int c 
1c360 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72  = -1;  /* pRes r
1c370 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69  eturn if table i
1c380 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20  s empty must be 
1c390 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20  -1 */.    lwr = 
1c3a0 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
1c3b0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
1c3c0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
1c3d0 4b 65 79 20 26 26 20 70 49 64 78 4b 65 79 3d 3d  Key && pIdxKey==
1c3e0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1c3f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1c400 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1c410 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1c420 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61     }.    if( bia
1c430 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  sRight ){.      
1c440 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1c450 2d 3e 69 50 61 67 65 5d 20 3d 20 75 70 72 3b 0a  ->iPage] = upr;.
1c460 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c470 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1c480 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 70 72  r->iPage] = (upr
1c490 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20  +lwr)/2;.    }. 
1c4a0 20 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20     if( lwr<=upr 
1c4b0 29 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20  ) for(;;){.     
1c4c0 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
1c4d0 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c  .      i64 nCell
1c4e0 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Key;.      int i
1c4f0 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
1c500 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1c510 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
1c520 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
1c530 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1c540 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
1c550 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1c560 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65  .        u8 *pCe
1c570 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ll;.        pCel
1c580 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1c590 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
1c5a0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
1c5b0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1c5c0 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
1c5d0 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d          u32 dumm
1c5e0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
1c5f0 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ll += getVarint3
1c600 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b  2(pCell, dummy);
1c610 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c620 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
1c630 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
1c640 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
1c650 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
1c660 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1c670 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
1c680 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
1c690 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
1c6a0 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
1c6b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c6c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1c6d0 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
1c6e0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
1c6f0 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1c700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c710 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65     int available
1c720 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b  ;.        pCellK
1c730 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74  ey = (void *)fet
1c740 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
1c750 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a  &available, 0);.
1c760 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79          nCellKey
1c770 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
1c780 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
1c790 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c  available>=nCell
1c7a0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1c7b0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
1c7c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
1c7d0 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1c7e0 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
1c7f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c800 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
1c810 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
1c820 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20  CellKey );.     
1c830 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
1c840 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
1c850 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c860 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
1c870 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
1c880 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
1c890 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
1c8a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
1c8b0 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  y(pCur, 0, nCell
1c8c0 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65  Key, (void *)pCe
1c8d0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
1c8e0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
1c8f0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1c900 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1c910 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
1c920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1c930 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
1c940 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
1c950 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69  ) goto moveto_fi
1c960 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
1c970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c980 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
1c990 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
1c9a0 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
1c9b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1c9c0 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
1c9d0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1c9e0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
1c9f0 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
1ca00 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  lwr - 1;.       
1ca10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ca20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ca30 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70     if( pRes ) *p
1ca40 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
1ca50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1ca60 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1ca70 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1ca80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ca90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30   }.      if( c<0
1caa0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20   ){.        lwr 
1cab0 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d  = idx+1;.      }
1cac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70  else{.        up
1cad0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
1cae0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72   }.      if( lwr
1caf0 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >upr ){.        
1cb00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
1cb10 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
1cb20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1cb30 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61   }.      pCur->a
1cb40 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1cb50 5d 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  ] = (lwr+upr)/2;
1cb60 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1cb70 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b  t( lwr==upr+1 );
1cb80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1cb90 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1cba0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
1cbb0 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  f ){.      chldP
1cbc0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
1cbd0 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
1cbe0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
1cbf0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
1cc00 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1cc10 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1cc20 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
1cc30 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
1cc40 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1cc50 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
1cc60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
1cc70 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ldPg==0 ){.     
1cc80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1cc90 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1cca0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
1ccb0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1ccc0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ll );.      if( 
1ccd0 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63  pRes ) *pRes = c
1cce0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1ccf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
1cd00 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1cd10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
1cd20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1cd30 61 67 65 5d 20 3d 20 6c 77 72 3b 0a 20 20 20 20  age] = lwr;.    
1cd40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1cd50 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
1cd60 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1cd70 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1cd80 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
1cd90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1cda0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1cdb0 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  sh;.  }.moveto_f
1cdc0 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20  inish:.  return 
1cdd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20  rc;.}../*.** In 
1cde0 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  this version of 
1cdf0 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65  BtreeMoveto, pKe
1ce00 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e  y is a packed in
1ce10 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75  dex record.** su
1ce20 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74  ch as is generat
1ce30 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
1ce40 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20  eRecord opcode. 
1ce50 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72   Unpack the.** r
1ce60 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63  ecord and then c
1ce70 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55  all BtreeMovetoU
1ce80 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20  npacked() to do 
1ce90 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74  the work..*/.int
1cea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1ceb0 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20  eto(.  BtCursor 
1cec0 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75  *pCur,     /* Cu
1ced0 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  rsor open on the
1cee0 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61   btree to be sea
1cef0 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  rched */.  const
1cf00 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
1cf10 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20  * Packed key if 
1cf20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20  the btree is an 
1cf30 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e  index */.  i64 n
1cf40 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
1cf50 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  * Integer key fo
1cf60 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20  r tables.  Size 
1cf70 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69  of pKey for indi
1cf80 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  ces */.  int bia
1cf90 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
1cfa0 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74  Bias search to t
1cfb0 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
1cfc0 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
1cfd0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
1cfe0 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
1cff0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1d000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d010 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63       /* Status c
1d020 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ode */.  Unpacke
1d030 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
1d040 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ;   /* Unpacked 
1d050 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 55  index key */.  U
1d060 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 61 53  npackedRecord aS
1d070 70 61 63 65 5b 31 36 5d 3b 20 2f 2a 20 54 65 6d  pace[16]; /* Tem
1d080 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78  p space for pIdx
1d090 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  Key - to avoid a
1d0a0 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66   malloc */..  if
1d0b0 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 49  ( pKey ){.    pI
1d0c0 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
1d0d0 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
1d0e0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
1d0f0 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20  nKey, pKey,.    
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d120 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66    aSpace, sizeof
1d130 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69  (aSpace));.    i
1d140 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
1d150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1d160 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
1d170 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
1d180 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1d190 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
1d1a0 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
1d1b0 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
1d1c0 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65  pRes);.  if( pKe
1d1d0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1d1e0 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
1d1f0 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79  edRecord(pIdxKey
1d200 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d210 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
1d220 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1d230 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
1d240 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1d250 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
1d260 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
1d270 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
1d280 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
1d290 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
1d2a0 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
1d2b0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1d2c0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
1d2d0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
1d2e0 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
1d2f0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
1d300 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
1d310 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
1d320 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1d330 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1d340 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
1d350 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
1d360 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
1d370 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
1d380 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
1d390 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
1d3a0 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
1d3b0 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
1d3c0 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
1d3d0 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
1d3e0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
1d3f0 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
1d400 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
1d410 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
1d420 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
1d430 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
1d440 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ate);.}../*.** R
1d450 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
1d460 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  se connection ha
1d470 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73 6f  ndle for a curso
1d480 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  r..*/.sqlite3 *s
1d490 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d4a0 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72 73  rDb(const BtCurs
1d4b0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
1d4c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d4d0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1d4e0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1d4f0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75   );.  return pCu
1d500 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 7d  r->pBtree->db;.}
1d510 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1d520 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1d530 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
1d540 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1d550 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
1d560 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
1d570 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1d580 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
1d590 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1d5a0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1d5b0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
1d5c0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
1d5d0 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
1d5e0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
1d5f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d600 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
1d610 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1d620 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1d630 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
1d640 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
1d650 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1d660 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1d670 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1d680 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1d690 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
1d6a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1d6b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1d6c0 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
1d6d0 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  );.  if( CURSOR_
1d6e0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1d6f0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
1d700 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
1d710 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d720 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
1d730 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip>0 ){.    pCur
1d740 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
1d750 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
1d760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d770 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
1d780 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  p = 0;..  pPage 
1d790 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1d7a0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
1d7b0 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
1d7c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
1d7d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1d7e0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
1d7f0 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65  sert( idx<=pPage
1d800 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43  ->nCell );..  pC
1d810 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1d820 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1d830 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
1d840 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
1d850 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
1d860 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1d870 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1d880 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
1d890 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1d8a0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1d8b0 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
1d8c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1d8d0 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  c;.      rc = mo
1d8e0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1d8f0 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  r);.      *pRes 
1d900 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1d910 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1d920 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
1d930 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
1d940 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
1d950 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
1d960 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1d970 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
1d980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d990 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1d9a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
1d9b0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
1d9c0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1d9d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1d9e0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
1d9f0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
1da00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
1da10 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
1da20 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1da30 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
1da40 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
1da50 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1da60 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
1da70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1da80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1da90 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
1daa0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
1dab0 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
1dac0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1dad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dae0 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
1daf0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1db00 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
1db10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  ;.}.../*.** Step
1db20 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1db30 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
1db40 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
1db50 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1db60 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
1db70 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1db80 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
1db90 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
1dba0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1dbb0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1dbc0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
1dbd0 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
1dbe0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
1dbf0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
1dc00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1dc10 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
1dc20 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1dc30 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1dc40 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
1dc50 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1dc60 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1dc70 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1dc80 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
1dc90 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1dca0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dcb0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1dcc0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
1dcd0 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69  >atLast = 0;.  i
1dce0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1dcf0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1dd00 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
1dd10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1dd20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1dd30 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29  ( pCur->skip<0 )
1dd40 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1dd50 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1dd60 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1dd70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1dd80 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1dd90 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
1dda0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1ddb0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
1ddc0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1ddd0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
1dde0 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
1ddf0 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
1de00 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
1de10 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1de20 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
1de30 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1de40 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
1de50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1de60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1de70 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1de80 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1de90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
1dea0 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
1deb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
1dec0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
1ded0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
1dee0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1def0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1df00 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
1df10 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1df20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1df30 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1df40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
1df50 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
1df60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
1df70 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1df80 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
1df90 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20  dNKey = 0;..    
1dfa0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1dfb0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
1dfc0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1dfd0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1dfe0 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
1dff0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
1e000 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1e010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1e020 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
1e030 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
1e040 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1e050 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1e060 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
1e070 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e080 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1e090 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
1e0a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e0b0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
1e0c0 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
1e0d0 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
1e0e0 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
1e0f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
1e100 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
1e110 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
1e120 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
1e130 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
1e140 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
1e150 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
1e160 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
1e170 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1e180 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
1e190 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1e1a0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
1e1b0 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
1e1c0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
1e1d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
1e1e0 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
1e1f0 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
1e200 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
1e210 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
1e220 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
1e230 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
1e240 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
1e250 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
1e260 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
1e270 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
1e280 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
1e290 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1e2a0 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
1e2b0 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
1e2c0 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28   not 0, then a (
1e2d0 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69  feeble) effort i
1e2e0 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
1e2f0 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
1e300 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
1e310 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
1e320 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1e330 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
1e340 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
1e350 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
1e360 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
1e370 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e380 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
1e390 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
1e3a0 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
1e3b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
1e3c0 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74   "exact" paramet
1e3d0 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64  er is not 0, and
1e3e0 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
1e3f0 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a   nearby exists .
1e400 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
1e410 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
1e420 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74  en it is guarent
1e430 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
1e440 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  ed. This.** is o
1e450 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f  nly used by auto
1e460 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1e470 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  s when allocatin
1e480 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  g a new table..*
1e490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1e4a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
1e4b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1e4c0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70   .  MemPage **pp
1e4d0 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70  Page, .  Pgno *p
1e4e0 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65  Pgno, .  Pgno ne
1e4f0 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74  arby,.  u8 exact
1e500 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
1e510 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
1e520 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a  .  int n;     /*
1e530 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e540 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1e550 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20   */.  int k;    
1e560 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
1e570 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
1e580 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
1e590 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
1e5a0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
1e5b0 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
1e5c0 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  k = 0;..  assert
1e5d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1e5e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1e5f0 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
1e600 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20  Bt->pPage1;.  n 
1e610 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1e620 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1e630 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1e640 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
1e650 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1e660 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
1e670 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
1e680 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
1e690 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
1e6a0 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
1e6b0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
1e6c0 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
1e6d0 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
1e6e0 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74      .    /* If t
1e6f0 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d  he 'exact' param
1e700 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e  eter was true an
1e710 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
1e720 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
1e730 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
1e740 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1e750 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
1e760 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1e770 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
1e780 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
1e790 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
1e7a0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
1e7b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1e7c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1e7d0 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20  M.    if( exact 
1e7e0 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67 65 72  && nearby<=pager
1e7f0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1e800 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1e810 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
1e820 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
1e830 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e840 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1e850 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
1e860 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
1e870 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
1e880 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1e890 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e8a0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1e8b0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1e8c0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
1e8d0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
1e8e0 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
1e8f0 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
1e900 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
1e910 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
1e920 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
1e930 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
1e940 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
1e950 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
1e960 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
1e970 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
1e980 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
1e990 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1e9a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e9b0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1e9c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e9d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
1e9e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1e9f0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
1ea00 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
1ea10 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
1ea20 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
1ea30 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
1ea40 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
1ea50 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
1ea60 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
1ea70 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
1ea80 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
1ea90 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
1eaa0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
1eab0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1eac0 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
1ead0 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
1eae0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1eaf0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
1eb00 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
1eb10 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
1eb20 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
1eb30 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
1eb40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1eb50 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
1eb60 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1eb70 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
1eb80 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1eb90 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1eba0 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
1ebb0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
1ebc0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1ebd0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1ebe0 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
1ebf0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1ec00 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
1ec10 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
1ec20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
1ec30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  );.      if( k==
1ec40 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74  0 && !searchList
1ec50 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1ec60 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20  he trunk has no 
1ec70 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c  leaves and the l
1ec80 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ist is not being
1ec90 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20   searched. .    
1eca0 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63      ** So extrac
1ecb0 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
1ecc0 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20   itself and use 
1ecd0 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20  it as the newly 
1ece0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
1ecf0 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
1ed00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1ed10 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20  revTrunk==0 );. 
1ed20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ed30 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1ed40 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1ed50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1ed60 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1ed70 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1ed80 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1ed90 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1eda0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d  Trunk;.        m
1edb0 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
1edc0 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
1edd0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1ede0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
1edf0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1ee00 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1ee10 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1ee20 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
1ee30 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
1ee40 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
1ee50 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
1ee60 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d  }else if( k>pBt-
1ee70 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
1ee80 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2 ){.        /* 
1ee90 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
1eea0 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
1eeb0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1eec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1eed0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1eee0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
1eef0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1ef00 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
1ef10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ef20 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
1ef30 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
1ef40 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  && nearby==iTrun
1ef50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
1ef60 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
1ef70 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
1ef80 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
1ef90 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
1efa0 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
1efb0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1efc0 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
1efd0 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
1efe0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1eff0 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e  t( *pPgno==iTrun
1f000 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  k );.        *pp
1f010 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
1f020 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
1f030 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
1f040 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f050 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1f060 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1f070 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1f080 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1f090 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1f0a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1f0b0 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
1f0c0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
1f0d0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
1f0e0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1f0f0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
1f100 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1f110 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
1f120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f130 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
1f140 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1f150 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1f160 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1f170 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1f180 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1f190 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
1f1a0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
1f1b0 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
1f1c0 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
1f1d0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
1f1e0 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
1f1f0 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
1f200 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
1f210 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
1f220 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1f230 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1f240 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
1f250 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
1f260 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
1f270 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
1f280 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1f290 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
1f2a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f2b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
1f2c0 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
1f2d0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
1f2e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f2f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f300 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1f310 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1f320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f340 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
1f350 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1f360 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1f370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f380 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1f390 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
1f3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1f3b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1f3c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1f3d0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1f3e0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
1f3f0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
1f400 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1f410 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1f420 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
1f430 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1f440 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f450 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1f460 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
1f470 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
1f480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
1f490 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
1f4a0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
1f4b0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
1f4c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
1f4d0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1f4e0 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
1f4f0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1f500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f510 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f520 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
1f530 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1f540 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f550 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1f560 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1f570 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1f580 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f590 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1f5a0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1f5b0 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
1f5c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1f5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f5e0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1f5f0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1f600 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
1f610 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
1f620 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
1f630 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
1f640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f650 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
1f660 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
1f670 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
1f680 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  int closest;.   
1f690 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
1f6a0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1f6b0 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
1f6c0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
1f6d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f6e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1f6f0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1f700 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1f710 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1f720 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1f730 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1f740 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
1f750 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1f760 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20  int i, dist;.   
1f770 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1f780 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
1f790 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
1f7a0 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
1f7b0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
1f7c0 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
1f7d0 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
1f7e0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
1f7f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1f800 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
1f810 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
1f820 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
1f830 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
1f840 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
1f850 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
1f860 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
1f870 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1f880 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
1f890 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
1f8a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f8b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f8c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f8d0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1f8e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1f8f0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
1f900 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1f910 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t*4]);.        i
1f920 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
1f930 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
1f940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1f950 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   nPage;.        
1f960 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
1f970 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61 67  ;.          nPag
1f980 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
1f990 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
1f9a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a  .          if( *
1f9b0 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29 7b 0a 20  pPgno>nPage ){. 
1f9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
1f9d0 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65 20  ee page off the 
1f9e0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1f9f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
1fa00 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1fa10 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1fa20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1fa30 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1fa40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fa50 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1fa60 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
1fa70 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
1fa80 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
1fa90 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
1faa0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
1fab0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fac0 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
1fad0 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
1fae0 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
1faf0 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
1fb00 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
1fb10 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
1fb20 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
1fb30 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
1fb40 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1fb50 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
1fb60 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
1fb70 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1fb80 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1fb90 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
1fba0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29  Pgno, ppPage, 1)
1fbb0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1fbc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1fbe0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1fbf0 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d  lback((*ppPage)-
1fc00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1fc10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1fc20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
1fc30 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1fc40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1fc50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fc60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1fc70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
1fc80 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1fc90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1fca0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
1fcb0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1fcc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fcd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1fce0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
1fcf0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1fd00 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
1fd10 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
1fd20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1fd30 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
1fd40 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
1fd50 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   so create a new
1fd60 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20   page at the.   
1fd70 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66   ** end of the f
1fd80 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ile */.    int n
1fd90 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
1fda0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1fdb0 72 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  r);.    *pPgno =
1fdc0 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 23 69 66   nPage + 1;..#if
1fdd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fde0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1fdf0 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
1fe00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69  ){.      /* An i
1fe10 6e 63 72 2d 76 61 63 75 75 6d 20 68 61 73 20 61  ncr-vacuum has a
1fe20 6c 72 65 61 64 79 20 72 75 6e 20 77 69 74 68 69  lready run withi
1fe30 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
1fe40 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20 20 20  on. So the.     
1fe50 20 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f   ** page to allo
1fe60 63 61 74 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d  cate is not from
1fe70 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e   the physical en
1fe80 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62  d of the file, b
1fe90 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 70  ut.      ** at p
1fea0 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20  Bt->nTrunc. .   
1feb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67     */.      *pPg
1fec0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  no = pBt->nTrunc
1fed0 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  +1;.      if( *p
1fee0 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
1fef0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1ff00 20 20 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29          (*pPgno)
1ff10 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1ff20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  }.    if( pBt->a
1ff30 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
1ff40 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1ff50 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
1ff60 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
1ff70 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
1ff80 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
1ff90 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
1ffa0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
1ffb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
1ffc0 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
1ffd0 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
1ffe0 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
1fff0 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
20000 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
20010 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
20020 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
20030 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
20040 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
20050 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
20060 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
20070 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
20080 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
20090 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
200a0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
200b0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
200c0 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
200d0 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d       if( *pPgno=
200e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
200f0 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50 67  GE(pBt) ){ (*pPg
20100 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 20  no)++; }.    }. 
20110 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
20120 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  nc ){.      pBt-
20130 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67 6e 6f  >nTrunc = *pPgno
20140 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
20150 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
20160 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
20170 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
20180 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20190 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
201a0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
201b0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
201c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
201d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
201e0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
201f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20200 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20210 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
20220 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
20230 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
20240 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
20250 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
20260 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
20270 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
20280 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
20290 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
202a0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
202b0 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
202c0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
202d0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
202e0 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  unk);.  if( rc==
202f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
20300 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
20310 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
20320 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
20330 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
20340 70 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  ppPage);.    ret
20350 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20360 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
20370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20380 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f 66  ** Add a page of
20390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
203a0 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  le to the freeli
203b0 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  st..**.** sqlite
203c0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73  3PagerUnref() is
203d0 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72 20   NOT called for 
203e0 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
203f0 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65   int freePage(Me
20400 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
20410 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20420 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d   pPage->pBt;.  M
20430 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
20440 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
20450 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20  int rc, n, k;.. 
20460 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20   /* Prepare the 
20470 70 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e 67  page for freeing
20480 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
20490 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
204a0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
204b0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
204c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29   pPage->pgno>1 )
204d0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
204e0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63  t = 0;..  /* Inc
204f0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
20500 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
20510 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
20520 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20530 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
20540 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
20550 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67  turn rc;.  n = g
20560 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
20570 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
20580 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
20590 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29  >aData[36], n+1)
205a0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
205b0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
205c0 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54   /* If the SQLIT
205d0 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  E_SECURE_DELETE 
205e0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
205f0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
20600 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73  then.  ** always
20610 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
20620 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
20630 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
20640 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
20650 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
20660 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
20670 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20680 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70  n rc;.  memset(p
20690 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
206a0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
206b0 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Size);.#endif.. 
206c0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
206d0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
206e0 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
206f0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
20700 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
20710 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
20720 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
20730 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
20740 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
20750 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
20760 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70 67  t(pBt, pPage->pg
20770 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  no, PTRMAP_FREEP
20780 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
20790 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
207a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 3d 3d 30  .  }..  if( n==0
207b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
207c0 69 73 20 74 68 65 20 66 69 72 73 74 20 66 72 65  is the first fre
207d0 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63  e page */.    rc
207e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
207f0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
20800 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20810 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20820 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
20830 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20  aData, 0, 8);.  
20840 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
20850 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70  e1->aData[32], p
20860 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
20870 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
20880 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22 2c  GE: %d first\n",
20890 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
208a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
208b0 4f 74 68 65 72 20 66 72 65 65 20 70 61 67 65 73  Other free pages
208c0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20   already exist. 
208d0 20 52 65 74 72 69 76 65 20 74 68 65 20 66 69 72   Retrive the fir
208e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
208f0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65    ** of the free
20900 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f 75  list and find ou
20910 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65  t how many leave
20920 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20  s it has. */.   
20930 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
20940 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
20950 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
20960 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
20970 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
20980 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
20990 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
209a0 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67  rn rc;.    k = g
209b0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
209c0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
209d0 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62  if( k>=pBt->usab
209e0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
209f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
20a00 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72  nk is full.  Tur
20a10 6e 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  n the page being
20a20 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65   freed into a ne
20a30 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b  w.      ** trunk
20a40 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65   page with no le
20a50 61 76 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  aves..      **. 
20a60 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
20a70 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
20a80 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
20a90 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
20aa0 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
20ab0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
20ac0 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
20ad0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
20ae0 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
20af0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
20b00 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
20b10 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
20b20 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
20b30 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
20b40 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
20b50 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
20b60 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
20b70 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
20b80 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
20b90 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
20ba0 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
20bb0 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
20bc0 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
20bd0 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
20be0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
20bf0 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
20c00 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
20c10 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
20c20 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74  e will contain t
20c30 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
20c40 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
20c50 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
20c60 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
20c70 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
20c80 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
20c90 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
20ca0 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
20cb0 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
20cc0 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
20cd0 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
20ce0 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
20cf0 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
20d00 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
20d10 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
20d20 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
20d30 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
20d40 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
20d50 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20d60 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
20d70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20d80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20d90 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
20da0 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75  age->aData, pTru
20db0 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nk->pgno);.     
20dc0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
20dd0 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
20de0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
20df0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20e00 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
20e10 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  no);.        TRA
20e20 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
20e30 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
20e40 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
20e50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20e60 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
20e70 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
20e80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
20e90 65 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20 20  e if( k<0 ){.   
20ea0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
20eb0 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73  ORRUPT;.    }els
20ec0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  e{.      /* Add 
20ed0 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20  the newly freed 
20ee0 70 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f  page as a leaf o
20ef0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
20f00 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  unk */.      rc 
20f10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
20f20 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
20f30 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
20f40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20f50 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
20f60 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
20f70 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20  [4], k+1);.     
20f80 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
20f90 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34  unk->aData[8+k*4
20fa0 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
20fb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20fc0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
20fd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20fe0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
20ff0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
21000 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
21010 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
21020 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
21030 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
21040 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
21050 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
21060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
21070 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
21080 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
210a0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
210b0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
210c0 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
210d0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
210e0 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61   clearCell(MemPa
210f0 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67  ge *pPage, unsig
21100 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29  ned char *pCell)
21110 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
21120 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
21130 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
21140 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
21150 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
21160 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f  t nOvfl;.  int o
21170 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
21180 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21190 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
211a0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
211b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
211c0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
211d0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
211e0 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
211f0 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
21200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21210 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
21220 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
21230 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
21240 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
21250 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
21260 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
21270 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
21280 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
21290 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
212a0 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
212b0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
212c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
212d0 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
212e0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
212f0 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
21300 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
21310 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
21320 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  - ){.    MemPage
21330 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28   *pOvfl;.    if(
21340 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
21350 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61  ovflPgno>pagerPa
21360 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
21370 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ger) ){.      re
21380 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
21390 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
213a0 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65  .    rc = getOve
213b0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
213c0 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
213d0 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26 6f   (nOvfl==0)?0:&o
213e0 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66  vflPgno);.    if
213f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
21400 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  ;.    rc = freeP
21410 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
21420 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
21430 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
21440 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
21450 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
21460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21470 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
21480 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
21490 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
214a0 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
214b0 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
214c0 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
214d0 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
214e0 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
214f0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
21500 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
21510 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
21520 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
21530 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
21540 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
21550 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
21560 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
21570 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
21580 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
21590 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
215a0 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
215b0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
215c0 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
215d0 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
215e0 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
215f0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
21600 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
21610 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
21620 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
21630 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
21640 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
21650 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
21660 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
21670 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
21680 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
21690 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
216a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
216b0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
216c0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
216d0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
216e0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
216f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
21700 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
21710 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
21720 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
21730 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
21740 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  key */.  const v
21750 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e  oid *pData,int n
21760 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64  Data,   /* The d
21770 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ata */.  int nZe
21780 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
21790 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
217a0 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61   zero bytes to a
217b0 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a  ppend to pData *
217c0 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20  /.  int *pnSize 
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217e0 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c     /* Write cell
217f0 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b   size here */.){
21800 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b  .  int nPayload;
21810 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72  .  const u8 *pSr
21820 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e  c;.  int nSrc, n
21830 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63  , rc;.  int spac
21840 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
21850 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d   *pOvfl = 0;.  M
21860 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61  emPage *pToRelea
21870 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  se = 0;.  unsign
21880 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
21890 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
218a0 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
218b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
218c0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
218d0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
218e0 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20   int nHeader;.  
218f0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
21900 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21910 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
21920 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
21930 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
21940 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
21950 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
21960 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
21970 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
21980 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
21990 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
219a0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
219b0 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
219c0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
219d0 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
219e0 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
219f0 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
21a00 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
21a10 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
21a20 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
21a30 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Key);.  sqlite3B
21a40 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
21a50 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
21a60 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
21a70 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e   info.nHeader==n
21a80 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Header );.  asse
21a90 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
21aa0 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
21ab0 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61   info.nData==nDa
21ac0 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a 20  ta+nZero );.  . 
21ad0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
21ae0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
21af0 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
21b00 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
21b10 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
21b20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
21b30 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
21b40 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
21b50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
21b60 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
21b70 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
21b80 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79  .    nSrc = nKey
21b90 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20  ;.  }.  *pnSize 
21ba0 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
21bb0 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f  spaceLeft = info
21bc0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c  .nLocal;.  pPayl
21bd0 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
21be0 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20  ader];.  pPrior 
21bf0 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
21c00 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69  verflow];..  whi
21c10 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
21c20 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
21c30 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eft==0 ){.      
21c40 69 6e 74 20 69 73 45 78 61 63 74 20 3d 20 30 3b  int isExact = 0;
21c50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21c60 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
21c70 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
21c80 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
21c90 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
21ca0 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
21cb0 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
21cc0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
21cd0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
21ce0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
21cf0 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
21d00 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
21d10 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
21d20 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
21d30 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
21d40 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
21d50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
21d60 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
21d70 20 70 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a 20   pgnoOvfl>1 ){. 
21d80 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 45 78           /* isEx
21d90 61 63 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20 20  act = 1; */.    
21da0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
21db0 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
21dc0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
21dd0 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26  e(pBt, &pOvfl, &
21de0 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76  pgnoOvfl, pgnoOv
21df0 66 6c 2c 20 69 73 45 78 61 63 74 29 3b 0a 23 69  fl, isExact);.#i
21e00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21e10 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
21e20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
21e30 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
21e40 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
21e50 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
21e60 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
21e70 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
21e80 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
21e90 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
21ea0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
21eb0 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
21ec0 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
21ed0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21ee0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
21ef0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
21f00 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
21f10 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
21f20 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
21f30 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
21f40 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
21f50 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
21f60 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
21f70 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
21f80 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
21f90 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
21fa0 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
21fb0 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
21fc0 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
21fd0 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20  e uninitialised 
21fe0 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
21ff0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
22000 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
22010 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
22020 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
22030 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
22040 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
22050 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
22060 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
22070 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
22080 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
22090 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
220a0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
220b0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
220c0 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29  ype, pgnoPtrmap)
220d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
220e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
220f0 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
22100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22110 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
22120 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
22130 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22140 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
22150 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
22170 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
22180 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
22190 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
221a0 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
221b0 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
221c0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
221d0 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
221e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
221f0 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
22200 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
22210 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
22220 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
22230 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
22240 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
22250 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
22260 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
22270 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
22280 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
22290 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
222a0 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
222b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
222c0 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
222d0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
222e0 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
222f0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
22300 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
22310 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
22320 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
22330 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
22340 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
22350 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
22360 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
22370 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b    if( nSrc==0 ){
22380 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  .      nSrc = nD
22390 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20  ata;.      pSrc 
223a0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  = pData;.    }. 
223b0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
223c0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
223d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
223e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
223f0 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
22400 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
22410 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
22420 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
22430 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
22440 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
22450 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
22460 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
22470 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
22480 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
22490 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
224a0 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
224b0 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
224c0 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
224d0 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
224e0 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
224f0 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
22500 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
22510 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
22520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 72 6f  /.static int dro
22530 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
22540 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
22550 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  nt sz){.  int i;
22560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
22570 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
22580 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  nt pc;         /
22590 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
225a0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
225b0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
225c0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
225d0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
225e0 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
225f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
22600 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
22610 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
22620 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  a[] */..  assert
22630 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
22640 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
22650 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
22660 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
22670 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
22680 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
22690 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
226a0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
226b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
226c0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
226d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
226e0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
226f0 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61  ata;.  ptr = &da
22700 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
22710 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20  fset + 2*idx];. 
22720 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
22730 74 72 29 3b 0a 20 20 69 66 20 28 20 70 63 3c 3d  tr);.  if ( pc<=
22740 31 30 20 7c 7c 20 70 63 2b 73 7a 3e 70 50 61 67  10 || pc+sz>pPag
22750 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
22760 7a 65 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  ze ) {.    retur
22770 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
22780 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 66 72 65  _BKPT;.  }.  fre
22790 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
227a0 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69  , sz);.  for(i=i
227b0 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  dx+1; i<pPage->n
227c0 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d  Cell; i++, ptr+=
227d0 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d  2){.    ptr[0] =
227e0 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72   ptr[2];.    ptr
227f0 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20  [1] = ptr[3];.  
22800 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
22810 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
22820 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
22830 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d  ffset+3], pPage-
22840 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
22850 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
22860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
22880 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
22890 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
228a0 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
228b0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
228c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
228d0 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
228e0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
228f0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
22900 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
22910 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
22920 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
22930 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
22940 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
22950 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
22960 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
22970 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
22980 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
22990 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
229a0 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
229b0 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  ->aOvfl[] and ma
229c0 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
229d0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
229e0 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
229f0 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
22a00 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
22a10 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
22a20 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
22a30 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
22a40 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
22a50 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
22a60 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
22a70 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
22a80 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
22a90 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
22aa0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
22ab0 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
22ac0 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
22ad0 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
22ae0 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
22af0 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
22b00 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
22b10 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
22b20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
22b30 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
22b40 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
22b50 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
22b60 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
22b70 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
22b80 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
22b90 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43  atic int insertC
22ba0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
22bb0 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
22bc0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
22bd0 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
22be0 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
22bf0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
22c00 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
22c10 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
22c20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
22c30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
22c40 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
22c50 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
22c60 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
22c70 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
22c80 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
22c90 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
22ca0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
22cb0 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
22cc0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20   needed */.  u8 
22cd0 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f  nSkip          /
22ce0 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  * Do not write t
22cf0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
22d00 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
22d10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
22d20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
22d30 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
22d40 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
22d50 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
22d60 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
22d70 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
22d80 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
22d90 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
22da0 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66  yte of content f
22db0 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64  or any cell in d
22dc0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65  ata[] */.  int e
22dd0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
22de0 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
22df0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
22e00 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
22e10 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
22e20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
22e30 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
22e40 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
22e50 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
22e60 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
22e70 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
22e80 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65  to data[] of the
22e90 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
22ea0 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
22eb0 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
22ec0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
22ed0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
22ee0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
22ef0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
22f00 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
22f10 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
22f20 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
22f30 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
22f40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
22f50 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
22f60 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
22f70 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
22f80 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
22f90 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
22fa0 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
22fb0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
22fc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
22fd0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
22fe0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
22ff0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
23000 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
23010 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
23020 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
23030 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
23040 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
23050 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
23060 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
23070 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
23080 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
23090 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
230a0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73 69 7a     assert( j<siz
230b0 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
230c0 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
230d0 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20  aOvfl[0]) );.   
230e0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
230f0 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  .pCell = pCell;.
23100 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
23110 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20  [j].idx = i;.   
23120 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
23130 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
23140 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
23150 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
23160 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
23170 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23180 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
23190 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
231a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
231b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
231c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
231d0 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
231e0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
231f0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
23200 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20  Offset;.    top 
23210 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
23220 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65  [hdr+5]);.    ce
23230 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
23240 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
23250 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
23260 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
23270 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73  ell + 2;.    ins
23280 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
23290 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64  2*i;.    if( end
232a0 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20   > top - sz ){. 
232b0 20 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67       rc = defrag
232c0 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
232d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
232e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
232f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 6f 70       }.      top
23310 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
23320 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
23330 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
23340 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
23350 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
23360 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
23370 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
23380 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
23390 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
233a0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
233b0 2b 35 5d 29 20 29 3b 0a 20 20 20 20 69 66 20 28  +5]) );.    if (
233c0 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e  idx+sz > pPage->
233d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
233e0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
233f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
23400 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
23410 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
23420 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
23430 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79  -= 2;.    memcpy
23440 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
23450 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
23460 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66  sz-nSkip);.    f
23470 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d  or(j=end-2, ptr=
23480 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
23490 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
234a0 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
234b0 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
234c0 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
234d0 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
234e0 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
234f0 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
23500 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
23510 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
23520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23530 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
23540 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
23550 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
23560 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
23570 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
23580 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
23590 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
235a0 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
235b0 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
235c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
235d0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
235e0 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
235f0 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  /.      CellInfo
23600 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c   info;.      sql
23610 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
23620 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
23630 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
23640 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
23650 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
23660 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
23670 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
23680 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  d );.      if( (
23690 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
236a0 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
236b0 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
236c0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50  cal ){.        P
236d0 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
236e0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
236f0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
23700 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
23710 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
23720 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  Bt, pgnoOvfl, PT
23730 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
23740 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
23750 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23760 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
23770 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
23780 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
23790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
237a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
237b0 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
237c0 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
237d0 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
237e0 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
237f0 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
23800 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
23810 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
23820 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
23830 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
23840 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
23850 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
23860 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
23870 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
23880 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
23890 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
238a0 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
238b0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
238c0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
238d0 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
238e0 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
238f0 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
23900 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
23910 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
23920 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
23930 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
23940 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20  t totalSize;    
23950 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
23960 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20   all cells */.  
23970 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
23980 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61    /* Index of pa
23990 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
239a0 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20  nt cellptr;     
239b0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
239c0 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
239d0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
239e0 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
239f0 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
23a00 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61  body */.  u8 *da
23a10 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ta;         /* D
23a20 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
23a30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
23a40 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
23a50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23a60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
23a70 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
23a80 75 74 65 78 29 20 29 3b 0a 20 20 74 6f 74 61 6c  utex) );.  total
23a90 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Size = 0;.  for(
23aa0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
23ab0 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a  +){.    totalSiz
23ac0 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  e += aSize[i];. 
23ad0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74   }.  assert( tot
23ae0 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d  alSize+2*nCell<=
23af0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a  pPage->nFree );.
23b00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
23b10 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63  >nCell==0 );.  c
23b20 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e  ellptr = pPage->
23b30 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61  cellOffset;.  da
23b40 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
23b50 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
23b60 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70  ->hdrOffset;.  p
23b70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
23b80 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
23b90 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  if( nCell ){.   
23ba0 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f   cellbody = allo
23bb0 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
23bc0 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20   totalSize);.   
23bd0 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
23be0 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  y>0 );.    asser
23bf0 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t( pPage->nFree 
23c00 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  >= 2*nCell );.  
23c10 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
23c20 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66  = 2*nCell;.    f
23c30 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
23c40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74   i++){.      put
23c50 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
23c60 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  ptr], cellbody);
23c70 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64  .      memcpy(&d
23c80 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61  ata[cellbody], a
23c90 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b  pCell[i], aSize[
23ca0 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70  i]);.      cellp
23cb0 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63  tr += 2;.      c
23cc0 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65  ellbody += aSize
23cd0 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  [i];.    }.    a
23ce0 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d  ssert( cellbody=
23cf0 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
23d00 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20  bleSize );.  }. 
23d10 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
23d20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nCell;.}../*.** 
23d30 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
23d40 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69  rameters determi
23d50 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61  ne how many adja
23d60 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69  cent pages get i
23d70 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20  nvolved.** in a 
23d80 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
23d90 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20  ion.  NN is the 
23da0 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  number of neighb
23db0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
23dc0 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  de.** of the pag
23dd0 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  e that participa
23de0 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
23df0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
23e00 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74  NB is the.** tot
23e10 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
23e20 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70  es that particip
23e30 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  ate, including t
23e40 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61  he target page a
23e50 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f  nd.** NN neighbo
23e60 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
23e70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e  e..**.** The min
23e80 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e  imum value of NN
23e90 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65   is 1 (of course
23ea0 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e  ).  Increasing N
23eb0 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f  N above 1.** (to
23ec0 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61   2 or 3) gives a
23ed0 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d   modest improvem
23ee0 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e  ent in SELECT an
23ef0 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d  d DELETE perform
23f00 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61  ance.** in excha
23f10 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72  nge for a larger
23f20 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20   degradation in 
23f30 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
23f40 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  E performance..*
23f50 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e  * The value of N
23f60 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76  N appears to giv
23f70 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  e the best resul
23f80 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23  ts overall..*/.#
23f90 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20  define NN 1     
23fa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23fb0 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
23fc0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
23fd0 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e   pPage */.#defin
23fe0 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20  e NB (NN*2+1)   
23ff0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65     /* Total page
24000 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
24010 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a  e balance */../*
24020 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
24030 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
24040 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f   balance(BtCurso
24050 72 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64  r*, int);..#ifnd
24060 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
24070 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
24080 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
24090 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
240a0 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
240b0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
240c0 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
240d0 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
240e0 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
240f0 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
24100 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
24110 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
24120 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
24130 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
24140 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
24150 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
24160 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
24170 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65  ying balance the
24180 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
24190 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
241a0 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
241b0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
241c0 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
241d0 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
241e0 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
241f0 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
24200 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
24210 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
24220 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
24230 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
24240 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
24250 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
24260 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
24270 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
24280 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
24290 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
242a0 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
242b0 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
242c0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
242d0 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
242e0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
242f0 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
24300 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
24310 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
24320 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
24330 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
24340 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
24350 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
24360 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
24370 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
24380 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
24390 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 42 74 43  alance_quick(BtC
243a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
243b0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
243c0 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 50  e *pNew = 0;.  P
243d0 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75  gno pgnoNew;.  u
243e0 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20  8 *pCell;.  u16 
243f0 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e  szCell;.  CellIn
24400 66 6f 20 69 6e 66 6f 3b 0a 20 20 4d 65 6d 50 61  fo info;.  MemPa
24410 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
24420 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24430 50 61 67 65 5d 3b 0a 20 20 4d 65 6d 50 61 67 65  Page];.  MemPage
24440 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72   *pParent = pCur
24450 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24460 50 61 67 65 2d 31 5d 3b 0a 20 20 42 74 53 68 61  Page-1];.  BtSha
24470 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
24480 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72  ->pBt;.  int par
24490 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74  entIdx = pParent
244a0 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50  ->nCell;   /* pP
244b0 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65  arent new divide
244c0 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  r cell index */.
244d0 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65    int parentSize
244e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
244f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
24500 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
24510 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65  */.  u8 parentCe
24520 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20  ll[64];         
24530 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
24540 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69  for the new divi
24550 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61  der cell */..  a
24560 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
24570 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
24580 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
24590 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
245a0 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72   new page. Inser
245b0 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  t the overflow c
245c0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20  ell from pPage. 
245d0 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65   ** into it. The
245e0 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65  n remove the ove
245f0 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
24600 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  pPage..  */.  rc
24610 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
24620 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
24630 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
24640 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
24650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 65  TE_OK ){.    pCe
24660 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66  ll = pPage->aOvf
24670 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20  l[0].pCell;.    
24680 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a  szCell = cellSiz
24690 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
246a0 6c 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65  l);.    zeroPage
246b0 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44  (pNew, pPage->aD
246c0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73  ata[0]);.    ass
246d0 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
246e0 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
246f0 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
24700 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
24710 20 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 20 69   .    /* pPage i
24720 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20  s currently the 
24730 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70  right-child of p
24740 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74  Parent. Change t
24750 68 69 73 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68  his.    ** so th
24760 61 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  at the right-chi
24770 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61  ld is the new pa
24780 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f  ge allocated abo
24790 76 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70 50  ve and.    ** pP
247a0 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d  age is the next-
247b0 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20  to-right child. 
247c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
247d0 67 6e 6f 72 65 20 74 68 65 20 72 65 74 75 72 6e  gnore the return
247e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 61   value of the ca
247f0 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c  ll to fillInCell
24800 28 29 2e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  (). fillInCell()
24810 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79  .    ** may only
24820 20 72 65 74 75 72 6e 20 6f 74 68 65 72 20 74 68   return other th
24830 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
24840 69 74 20 69 73 20 72 65 71 75 69 72 65 64 20 74  it is required t
24850 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a  o allocate.    *
24860 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  * one or more ov
24870 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 53 69  erflow pages. Si
24880 6e 63 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  nce an internal 
24890 74 61 62 6c 65 20 42 2d 54 72 65 65 20 63 65 6c  table B-Tree cel
248a0 6c 20 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 65  l .    ** may ne
248b0 76 65 72 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f  ver spill over o
248c0 6e 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nto an overflow 
248d0 70 61 67 65 20 28 69 74 20 69 73 20 61 20 6d 61  page (it is a ma
248e0 78 69 6d 75 6d 20 6f 66 20 0a 20 20 20 20 2a 2a  ximum of .    **
248f0 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a   13 bytes in siz
24900 65 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  e), it is not ne
24910 63 63 65 73 73 61 72 79 20 74 6f 20 63 68 65 63  ccessary to chec
24920 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
24930 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
24940 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
24950 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 66 75 6e  insertCell() fun
24960 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
24970 6c 20 69 66 20 74 68 65 20 70 61 67 65 0a 20 20  l if the page.  
24980 20 20 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65 72    ** being inser
24990 74 65 64 20 69 6e 74 6f 20 69 73 20 61 6c 72 65  ted into is alre
249a0 61 64 79 20 77 72 69 74 61 62 6c 65 20 61 6e 64  ady writable and
249b0 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e   the cell does n
249c0 6f 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ot .    ** conta
249d0 69 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  in an overflow p
249e0 6f 69 6e 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72  ointer. So ignor
249f0 65 20 74 68 69 73 20 72 65 74 75 72 6e 20 63 6f  e this return co
24a00 64 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  de too..    */. 
24a10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24a20 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
24a30 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
24a40 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  l(pPage, pPage->
24a50 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 73 71  nCell-1);.    sq
24a60 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
24a70 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
24a80 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
24a90 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
24aa0 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  ent, parentCell,
24ab0 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
24ac0 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53  , 0, 0, &parentS
24ad0 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ize);.    assert
24ae0 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20  ( parentSize<64 
24af0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
24b00 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
24b10 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
24b20 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
24b30 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
24b40 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70  nt, parentIdx, p
24b50 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e  arentCell, paren
24b60 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20  tSize, 0, 4);.  
24b70 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
24b80 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
24b90 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20  ent,parentIdx), 
24ba0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
24bb0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
24bc0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
24bd0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
24be0 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20  , pgnoNew);.  . 
24bf0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
24c00 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
24c10 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
24c20 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
24c30 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  .    ** with ent
24c40 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
24c50 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
24c60 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
24c70 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
24c80 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
24c90 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
24ca0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
24cb0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
24cc0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
24cd0 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
24ce0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
24cf0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
24d00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24d10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24d20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
24d30 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20  vfl(pNew, 0);.  
24d40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
24d50 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
24d60 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
24d70 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
24d80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
24d90 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ew);.  }..  /* A
24da0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
24db0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 76 61   pPage->nFree va
24dc0 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65  riable is not se
24dd0 74 20 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68  t correctly with
24de0 0a 20 20 2a 2a 20 72 65 73 70 65 63 74 20 74 6f  .  ** respect to
24df0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
24e00 74 68 65 20 70 61 67 65 20 28 62 65 63 61 75 73  the page (becaus
24e10 65 20 69 74 20 77 61 73 20 73 65 74 20 74 6f 20  e it was set to 
24e20 30 20 62 79 20 0a 20 20 2a 2a 20 69 6e 73 65 72  0 by .  ** inser
24e30 74 43 65 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c 20  tCell). So call 
24e40 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
24e50 50 61 67 65 28 29 20 74 6f 20 6d 61 6b 65 20 73  Page() to make s
24e60 75 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 63  ure it is.  ** c
24e70 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a  orrect..  **.  *
24e80 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65  * This has to be
24e90 20 64 6f 6e 65 20 65 76 65 6e 20 69 66 20 61 6e   done even if an
24ea0 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
24eb0 65 74 75 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c  eturned. Normall
24ec0 79 2c 20 69 66 0a 20 20 2a 2a 20 61 6e 20 65 72  y, if.  ** an er
24ed0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
24ee0 67 20 74 72 65 65 20 62 61 6c 61 6e 63 69 6e 67  g tree balancing
24ef0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
24f00 66 20 4d 65 6d 50 61 67 65 20 61 72 65 0a 20 20  f MemPage are.  
24f10 2a 2a 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  ** not important
24f20 2c 20 61 73 20 74 68 65 79 20 77 69 6c 6c 20 62  , as they will b
24f30 65 20 72 65 63 61 6c 63 75 6c 61 74 65 64 20 77  e recalculated w
24f40 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
24f50 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
24f60 2e 20 42 75 74 20 68 65 72 65 2c 20 69 6e 20 62  . But here, in b
24f70 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 2c 20  alance_quick(), 
24f80 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
24f90 68 61 74 20 70 50 61 67 65 20 68 61 73 20 0a 20  hat pPage has . 
24fa0 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e   ** not yet been
24fb0 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 6f 72   marked dirty or
24fc0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
24fd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
24fe0 54 68 65 72 65 66 6f 72 65 0a 20 20 2a 2a 20 69  Therefore.  ** i
24ff0 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f  t will not be ro
25000 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 73 6f  lled back and so
25010 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
25020 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
25030 61 74 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  at.  ** the page
25040 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 74 65 6e   data and conten
25050 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72  ts of MemPage ar
25060 65 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20  e consistent..  
25070 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  */.  pPage->isIn
25080 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
25090 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
250a0 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Page);..  /* If 
250b0 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 20  everything else 
250c0 73 75 63 63 65 65 64 65 64 2c 20 62 61 6c 61 6e  succeeded, balan
250d0 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
250e0 67 65 2c 20 69 6e 20 0a 20 20 2a 2a 20 63 61 73  ge, in .  ** cas
250f0 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  e the divider ce
25100 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73  ll inserted caus
25110 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20  ed it to become 
25120 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20  overfull..  */. 
25130 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25140 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
25150 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
25160 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
25170 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
25180 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a  e(pCur, 0);.  }.
25190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
251a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
251b0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
251c0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  E */../*.** This
251d0 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72   routine redistr
251e0 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20  ibutes Cells on 
251f0 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
25200 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  NN*2 siblings.**
25210 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61   of pPage so tha
25220 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65  t all pages have
25230 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20   about the same 
25240 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73  amount of free s
25250 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79  pace..** Usually
25260 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
25270 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
25280 50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20  Page is used in 
25290 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a  the balancing,.*
252a0 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69  * though more si
252b0 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
252c0 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20  e from one side 
252d0 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
252e0 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74  first.** or last
252f0 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61   child of its pa
25300 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20  rent.  If pPage 
25310 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
25320 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  *NN siblings.** 
25330 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68  (something which
25340 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
25350 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65   if pPage is the
25360 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20   root page or a 
25370 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f  .** child of roo
25380 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69  t) then all avai
25390 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70  lable siblings p
253a0 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
253b0 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a  e balancing..**.
253c0 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
253d0 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61   siblings of pPa
253e0 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
253f0 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
25400 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20  ed by one or.** 
25410 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
25420 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
25430 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
25440 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68  ot over full. Th
25450 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  e root page.** i
25460 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73  s special and is
25470 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e   allowed to be n
25480 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20  early empty. If 
25490 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65  pPage is .** the
254a0 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
254b0 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
254c0 65 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20  e tree might be 
254d0 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20  increased.** or 
254e0 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65  decreased by one
254f0 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20  , as necessary, 
25500 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74  to keep the root
25510 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67   page from being
25520 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  .** overfull or 
25530 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
25540 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
25550 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
25560 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
25570 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73  ome of the Cells
25580 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   on pPage.** mig
25590 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
255a0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  be stored in pPa
255b0 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68  ge->aData[].  Th
255c0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
255d0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
255e0 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20  overfull.  Part 
255f0 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68  of the job of th
25600 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
25610 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  .** make sure al
25620 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67  l Cells for pPag
25630 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74  e once again fit
25640 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61   in pPage->aData
25650 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  []..**.** In the
25660 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
25670 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67  cing the sibling
25680 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20  s of pPage, the 
25690 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a  parent of pPage.
256a0 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20  ** might become 
256b0 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
256c0 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20  rfull.  If that 
256d0 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68  happens, then th
256e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
256f0 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
25700 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  ely on the paren
25710 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
25720 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
25730 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
25740 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
25750 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
25760 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
25770 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  te.  So if this 
25780 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74  routine fails, t
25790 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
257a0 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20  ld.** be rolled 
257b0 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
257c0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
257d0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
257e0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
257f0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
25800 20 20 20 20 2f 2a 20 54 68 65 20 6f 76 65 72 20      /* The over 
25810 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20 70 61 67  or underfull pag
25820 65 20 74 6f 20 62 61 6c 61 6e 63 65 20 2a 2f 0a  e to balance */.
25830 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
25840 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
25850 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20  * The parent of 
25860 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61  pPage */.  BtSha
25870 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
25880 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77          /* The w
25890 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  hole database */
258a0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30  .  int nCell = 0
258b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
258c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
258d0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
258e0 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c  /.  int nMaxCell
258f0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
25900 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
25910 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a  ze of apCell, sz
25920 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a  Cell, aFrom. */.
25930 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20    int nOld;     
25940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25950 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
25960 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  s in apOld[] */.
25970 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20    int nNew;     
25980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25990 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
259a0 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  s in apNew[] */.
259b0 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20    int nDiv;     
259c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
259d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
259e0 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a  s in apDiv[] */.
259f0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20    int i, j, k;  
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25a10 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
25a20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  */.  int idx;   
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a40 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50    /* Index of pP
25a50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  age in pParent->
25a60 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
25a70 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
25a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
25a90 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
25aa0 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
25ab0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
25ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ad0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
25ae0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
25af0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
25b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
25b10 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
25b20 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
25b30 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
25b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b50 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
25b60 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
25b70 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
25b80 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
25b90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
25ba0 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
25bb0 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
25bc0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
25bd0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
25be0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
25bf0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
25c00 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
25c10 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
25c20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
25c30 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
25c40 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
25c50 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
25c60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
25c70 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
25c80 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
25c90 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
25ca0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
25cb0 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
25cc0 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
25cd0 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  e2[] */.  int sz
25ce0 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20  Scratch;        
25cf0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
25d00 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79  f scratch memory
25d10 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
25d20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e  MemPage *apOld[N
25d30 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  B];          /* 
25d40 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
25d50 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  two siblings */.
25d60 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e    Pgno pgnoOld[N
25d70 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  B];            /
25d80 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66  * Page numbers f
25d90 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
25da0 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  apOld[] */.  Mem
25db0 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d  Page *apCopy[NB]
25dc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69  ;         /* Pri
25dd0 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61  vate copies of a
25de0 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a  pOld[] pages */.
25df0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77    MemPage *apNew
25e00 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f  [NB+2];        /
25e10 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
25e20 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66  o NB siblings af
25e30 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f  ter balancing */
25e40 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b  .  Pgno pgnoNew[
25e50 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
25e60 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20  /* Page numbers 
25e70 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
25e80 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38   apNew[] */.  u8
25e90 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20   *apDiv[NB];    
25ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
25eb0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
25ec0 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
25ed0 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
25ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
25ef0 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
25f00 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
25f10 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
25f20 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
25f30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
25f40 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
25f50 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
25f60 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
25f70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
25f80 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
25f90 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
25fa0 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
25fb0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
25fc0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
25fd0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
25fe0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
25ff0 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20  u8 *aCopy[NB];  
26000 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
26010 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  for holding data
26020 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a   of apCopy[] */.
26030 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20    u8 *aSpace1;  
26040 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
26050 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
26060 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 62  dividers cells b
26070 65 66 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f  efore balance */
26080 0a 20 20 75 38 20 2a 61 53 70 61 63 65 32 20 3d  .  u8 *aSpace2 =
26090 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 70 61   0;       /* Spa
260a0 63 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ce for overflow 
260b0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61  dividers cells a
260c0 66 74 65 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a  fter balance */.
260d0 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b    u8 *aFrom = 0;
260e0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
260f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26100 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
26110 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
26120 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
26130 6d 75 74 65 78 29 20 29 3b 0a 20 20 56 56 41 5f  mutex) );.  VVA_
26140 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65  ONLY( pCur->page
26150 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b  sShuffled = 1 );
26160 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e  ..  /* .  ** Fin
26170 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  d the parent pag
26180 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
26190 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
261a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
261b0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
261c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
261d0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
261e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
261f0 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  || pPage->nOverf
26200 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20  low==1 );.  pBt 
26210 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
26220 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  pParent = pCur->
26230 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26240 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge-1];.  assert(
26250 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66   pParent );.  if
26260 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
26270 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26280 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
26290 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
262a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
262b0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
262c0 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
262d0 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
262e0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
262f0 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23  rent->pgno));..#
26300 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26310 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
26320 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63    /*.  ** A spec
26330 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20  ial case:  If a 
26340 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75  new entry has ju
26350 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  st been inserted
26360 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62   into a.  ** tab
26370 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62  le (that is, a b
26380 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65  tree with intege
26390 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64  r keys and all d
263a0 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65  ata at the leave
263b0 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  s).  ** and the 
263c0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65  new entry is the
263d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
263e0 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69  y in the tree (i
263f0 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c  t has the.  ** l
26400 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e  argest key) then
26410 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c   use the special
26420 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
26430 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a   routine for.  *
26440 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61  * balancing.  ba
26450 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
26460 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64   much faster and
26470 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69   results in a ti
26480 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69  ghter.  ** packi
26490 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  ng of data in th
264a0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
264b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
264c0 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70  >leaf &&.      p
264d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a  Page->intKey &&.
264e0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
264f0 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20  erflow==1 &&.   
26500 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
26510 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
26520 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50  Cell &&.      pP
26530 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26  arent->pgno!=1 &
26540 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65  &.      get4byte
26550 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
26560 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
26570 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+8])==pPage->
26580 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73  pgno.  ){.    as
26590 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
265a0 4b 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20  Key );.    /*.  
265b0 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    ** TODO: Check
265c0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f   the siblings to
265d0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61   the left of pPa
265e0 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68  ge. It may be th
265f0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61  at.    ** they a
26600 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20  re not full and 
26610 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72  no new page is r
26620 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
26630 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e      return balan
26640 63 65 5f 71 75 69 63 6b 28 70 43 75 72 29 3b 0a  ce_quick(pCur);.
26650 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
26660 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
26670 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26680 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
26690 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74  age)) ){.    ret
266a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
266b0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
266c0 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65  cell in the pare
266d0 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c 65  nt page whose le
266e0 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20  ft child points 
266f0 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61  back.  ** to pPa
26700 67 65 2e 20 20 54 68 65 20 22 69 64 78 22 20 76  ge.  The "idx" v
26710 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 69  ariable is the i
26720 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 65 6c  ndex of that cel
26730 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20 2a  l.  If pPage.  *
26740 2a 20 69 73 20 74 68 65 20 72 69 67 68 74 6d 6f  * is the rightmo
26750 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  st child of pPar
26760 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64 78  ent then set idx
26770 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   to pParent->nCe
26780 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d  ll .  */.  idx =
26790 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
267a0 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61  r->iPage-1];.  a
267b0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
267c0 28 70 50 61 72 65 6e 74 2c 20 69 64 78 2c 20 70  (pParent, idx, p
267d0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  Page->pgno);..  
267e0 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69  /*.  ** Initiali
267f0 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20  ze variables so 
26800 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
26810 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a  safe to jump.  *
26820 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61  * directly to ba
26830 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74  lance_cleanup at
26840 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a   any moment..  *
26850 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20  /.  nOld = nNew 
26860 3d 20 30 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  = 0;..  /*.  ** 
26870 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67  Find sibling pag
26880 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20  es to pPage and 
26890 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
268a0 72 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65  rent that divide
268b0 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e  .  ** the siblin
268c0 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20  gs.  An attempt 
268d0 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
268e0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
268f0 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20  ither.  ** side 
26900 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20  of pPage.  More 
26910 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
26920 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
26930 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20  , however, if.  
26940 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61  ** pPage there a
26950 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
26960 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
26970 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66   other side.  If
26980 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
26990 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
269a0 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
269b0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
269c0 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20  ent are taken.. 
269d0 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64   */.  nxDiv = id
269e0 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78  x - NN;.  if( nx
269f0 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65  Div + NB > pPare
26a00 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
26a10 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74   nxDiv = pParent
26a20 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31  ->nCell - NB + 1
26a30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69  ;.  }.  if( nxDi
26a40 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  v<0 ){.    nxDiv
26a50 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76   = 0;.  }.  nDiv
26a60 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 0;.  for(i=0,
26a70 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20   k=nxDiv; i<NB; 
26a80 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69  i++, k++){.    i
26a90 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43  f( k<pParent->nC
26aa0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44  ell ){.      apD
26ab0 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
26ac0 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20  (pParent, k);.  
26ad0 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20      nDiv++;.    
26ae0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65    assert( !pPare
26af0 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  nt->leaf );.    
26b00 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67    pgnoOld[i] = g
26b10 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
26b20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
26b30 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65   k==pParent->nCe
26b40 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  ll ){.      pgno
26b50 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
26b60 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
26b70 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
26b80 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
26b90 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
26ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
26bb0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
26bc0 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c  pBt, pgnoOld[i],
26bd0 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20   &apOld[i]);.   
26be0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
26bf0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
26c00 20 20 20 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d      /* apOld[i]-
26c10 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 20  >idxParent = k; 
26c20 2a 2f 0a 20 20 20 20 61 70 43 6f 70 79 5b 69 5d  */.    apCopy[i]
26c30 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
26c40 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20  ( i==nOld );.   
26c50 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61   nOld++;.    nMa
26c60 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
26c70 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
26c80 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
26c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
26ca0 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
26cb0 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
26cc0 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
26cd0 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
26ce0 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
26cf0 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
26d00 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
26d10 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
26d20 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
26d30 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
26d40 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20   szScratch =.   
26d50 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
26d60 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d80 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
26d90 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
26da0 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20  zeof(u16)       
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* szCell */.   
26dd0 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a 65    + (ROUND8(size
26de0 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42 74  of(MemPage))+pBt
26df0 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20 20  ->pageSize)*NB  
26e00 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20  /* aCopy */.    
26e10 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e40 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
26e50 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55    + (ISAUTOVACUU
26e60 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20  M ? nMaxCells : 
26e70 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0);             
26e80 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70  /* aFrom */.  ap
26e90 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63  Cell = sqlite3Sc
26ea0 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53  ratchMalloc( szS
26eb0 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28  cratch ); .  if(
26ec0 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
26ed0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
26ee0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
26ef0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
26f00 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75   }.  szCell = (u
26f10 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  16*)&apCell[nMax
26f20 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b  Cells];.  aCopy[
26f30 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  0] = (u8*)&szCel
26f40 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
26f50 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
26f60 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  0] - (u8*)apCell
26f70 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
26f80 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
26f90 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66   required */.  f
26fa0 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b  or(i=1; i<NB; i+
26fb0 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d  +){.    aCopy[i]
26fc0 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70   = &aCopy[i-1][p
26fd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
26fe0 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
26ff0 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72  ge))];.    asser
27000 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20  t( ((aCopy[i] - 
27010 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
27020 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
27030 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
27040 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53  ired */.  }.  aS
27050 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79 5b 4e  pace1 = &aCopy[N
27060 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  B-1][pBt->pageSi
27070 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ze+ROUND8(sizeof
27080 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61  (MemPage))];.  a
27090 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65 31  ssert( ((aSpace1
270a0 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
270b0 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
270c0 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
270d0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28  equired */.  if(
270e0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
270f0 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53  .    aFrom = &aS
27100 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
27110 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70 61  ize];.  }.  aSpa
27120 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ce2 = sqlite3Pag
27130 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67  eMalloc(pBt->pag
27140 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61 53  eSize);.  if( aS
27150 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20  pace2==0 ){.    
27160 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
27170 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
27180 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
27190 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61  .  .  /*.  ** Ma
271a0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
271b0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67   content of pPag
271c0 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
271d0 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a  gs into aOld[]..
271e0 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
271f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
27200 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
27210 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
27220 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  her.  ** that th
27230 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
27240 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
27250 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
27260 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72  e in the.  ** pr
27270 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f  ocess of being o
27280 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  verwritten..  */
27290 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
272a0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
272b0 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70  mPage *p = apCop
272c0 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
272d0 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d  )aCopy[i];.    m
272e0 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69  emcpy(p, apOld[i
272f0 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  ], sizeof(MemPag
27300 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  e));.    p->aDat
27310 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d  a = (void*)&p[1]
27320 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
27330 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d  aData, apOld[i]-
27340 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67  >aData, pBt->pag
27350 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
27360 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
27370 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
27380 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
27390 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
273a0 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
273b0 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
273c0 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
273d0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
273e0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
273f0 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
27400 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70  btained form aSp
27410 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
27420 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
27430 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
27440 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
27450 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
27460 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
27470 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
27480 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
27490 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
274a0 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
274b0 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
274c0 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
274d0 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
274e0 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d  * into aSpace1[]
274f0 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
27500 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
27510 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
27520 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
27530 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
27540 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
27550 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
27560 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
27570 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
27580 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
27590 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
275a0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
275b0 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
275c0 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
275d0 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
275e0 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
275f0 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
27600 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
27610 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
27620 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
27630 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
27640 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
27650 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43   keys..  */.  nC
27660 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43  ell = 0;.  leafC
27670 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67  orrection = pPag
27680 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  e->leaf*4;.  lea
27690 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 68  fData = pPage->h
276a0 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d  asData;.  for(i=
276b0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
276c0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
276d0 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a  ld = apCopy[i];.
276e0 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
276f0 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
27700 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
27710 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
27720 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  t; j++){.      a
27730 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
27740 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
27750 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
27760 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
27770 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20  (pOld, j);.     
27780 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
27790 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
277a0 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
277b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  );.      if( ISA
277c0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
277d0 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20       int a;.    
277e0 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
277f0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f   = i;.        fo
27800 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e  r(a=0; a<pOld->n
27810 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a  Overflow; a++){.
27820 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
27830 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65  ld->aOvfl[a].pCe
27840 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ll==apCell[nCell
27850 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
27860 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
27870 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20  0xFF;.          
27880 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
27890 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
278a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65       }.      nCe
278b0 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll++;.    }.    
278c0 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a  if( i<nOld-1 ){.
278d0 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 63        u16 sz = c
278e0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
278f0 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
27900 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
27910 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
27920 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41 54  With the LEAFDAT
27930 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20  A flag, pParent 
27940 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20  cells hold only 
27950 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20  INTKEYs that.   
27960 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c       ** are dupl
27970 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f  icates of keys o
27980 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
27990 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  s.  We need to r
279a0 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a  emove.        **
279b0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
279c0 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c  ls from pParent,
279d0 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65 72   but the divider
279e0 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a  s cells are not.
279f0 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64          ** added
27a00 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63   to apCell[] bec
27a10 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64 75  ause they are du
27a20 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c  plicates of chil
27a30 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20  d cells..       
27a40 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70   */.        drop
27a50 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
27a60 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
27a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
27a80 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
27a90 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
27aa0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
27ab0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
27ac0 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  l] = sz;.       
27ad0 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
27ae0 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
27af0 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73      iSpace1 += s
27b00 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
27b10 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65  t( sz<=pBt->page
27b20 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20  Size/4 );.      
27b30 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
27b40 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1<=pBt->pageSize
27b50 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
27b60 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
27b70 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  i], sz);.       
27b80 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
27b90 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
27ba0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
27bb0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
27bc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72  ){.          aFr
27bd0 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
27be0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27bf0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
27c00 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
27c10 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
27c20 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43  [nCell] -= leafC
27c30 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
27c40 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
27c50 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f  yte(pTemp)==pgno
27c60 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20  Old[i] );.      
27c70 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
27c80 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  f ){.          a
27c90 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
27ca0 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
27cb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
27cc0 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
27cd0 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
27ce0 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
27cf0 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ft.          ** 
27d00 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
27d10 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
27d20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
27d30 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
27d40 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64  pOld->aData[pOld
27d50 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
27d60 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
27d70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
27d80 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
27d90 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
27da0 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e      if( szCell[n
27db0 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20  Cell]<4 ){.     
27dc0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
27dd0 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
27de0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
27df0 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
27e00 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
27e10 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll] = 4;.       
27e20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27e30 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a         nCell++;.
27e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27e50 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
27e60 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
27e70 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
27e80 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
27e90 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
27ea0 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
27eb0 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
27ec0 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
27ed0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
27ee0 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
27ef0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
27f00 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
27f10 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
27f20 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
27f30 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
27f40 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
27f50 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
27f60 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
27f70 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
27f80 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
27f90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
27fa0 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
27fb0 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
27fc0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
27fd0 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
27fe0 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
27ff0 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
28000 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
28010 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
28020 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
28030 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
28040 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
28050 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
28060 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
28070 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
28080 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
28090 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
280a0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
280b0 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
280c0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
280d0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
280e0 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
280f0 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
28100 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
28110 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
28120 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
28130 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
28140 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
28150 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
28160 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
28170 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
28180 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
28190 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
281a0 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
281b0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
281c0 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
281d0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
281e0 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
281f0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
28200 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
28210 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
28220 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20      k++;.    }. 
28230 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
28240 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
28250 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
28260 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
28270 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
28280 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
28290 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
282a0 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
282b0 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
282c0 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
282d0 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
282e0 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
282f0 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
28300 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
28310 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
28320 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
28330 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
28340 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
28350 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
28360 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
28370 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
28380 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
28390 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
283a0 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
283b0 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
283c0 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
283d0 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
283e0 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
283f0 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
28400 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
28410 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
28420 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
28430 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
28440 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
28450 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
28460 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
28470 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
28480 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
28490 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
284a0 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
284b0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
284c0 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
284d0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
284e0 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
284f0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
28500 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
28510 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
28520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
28530 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
28540 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
28550 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
28560 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
28570 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
28580 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
28590 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
285a0 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
285b0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
285c0 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
285d0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
285e0 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
285f0 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
28600 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
28610 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
28620 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67  ight==0 || szRig
28630 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
28640 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
28650 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a  ]+2) ){.      sz
28660 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
28670 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
28680 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
28690 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
286a0 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
286b0 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
286c0 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
286d0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
286e0 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
286f0 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
28700 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
28710 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
28720 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
28730 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
28740 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
28750 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20 74  )>0) or we are t
28760 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  he.  ** a virtua
28770 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
28780 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
28790 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
287a0 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
287b0 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
287c0 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
287d0 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
287e0 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
287f0 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
28800 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
28810 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
28820 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  nCell==0) );..  
28830 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
28840 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
28850 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
28860 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
28870 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
28880 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
28890 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61   pageFlags = pPa
288a0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  ge->aData[0];.  
288b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
288c0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
288d0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
288e0 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
288f0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
28900 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
28910 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
28920 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  noOld[i];.      
28930 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
28940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28950 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
28960 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
28970 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
28980 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
28990 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
289a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
289b0 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
289c0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
289d0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
289e0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b  &pNew, &pgnoNew[
289f0 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d  i], pgnoNew[i-1]
28a00 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
28a10 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
28a20 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
28a30 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
28a40 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
28a50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
28a60 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
28a70 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
28a80 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
28a90 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
28aa0 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
28ab0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
28ac0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69  apOld[i]);.    i
28ad0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
28ae0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
28af0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
28b00 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
28b10 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
28b20 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
28b30 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
28b40 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
28b50 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
28b60 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
28b70 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
28b80 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
28b90 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
28ba0 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
28bb0 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
28bc0 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
28bd0 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
28be0 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
28bf0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
28c00 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
28c10 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
28c20 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
28c30 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
28c40 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65  * An O(n^2) inse
28c50 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72  rtion sort algor
28c60 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75  ithm is used, bu
28c70 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69  t since.  ** n i
28c80 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
28c90 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f  n NB (a small co
28ca0 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68  nstant), that sh
28cb0 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65  ould.  ** not be
28cc0 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a   a problem..  **
28cd0 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33  .  ** When NB==3
28ce0 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d  , this one optim
28cf0 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68  ization makes th
28d00 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
28d10 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72  about 25% faster
28d20 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72   for large inser
28d30 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69  tions and deleti
28d40 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
28d50 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29  i=0; i<k-1; i++)
28d60 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d  {.    int minV =
28d70 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20   pgnoNew[i];.   
28d80 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20   int minI = i;. 
28d90 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
28da0 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; j++){.      i
28db0 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75  f( pgnoNew[j]<(u
28dc0 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
28dd0 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
28de0 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
28df0 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20   pgnoNew[j];.   
28e00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
28e10 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
28e20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
28e30 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
28e40 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69     t = pgnoNew[i
28e50 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70  ];.      pT = ap
28e60 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  New[i];.      pg
28e70 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e  noNew[i] = pgnoN
28e80 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
28e90 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77  apNew[i] = apNew
28ea0 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67  [minI];.      pg
28eb0 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b  noNew[minI] = t;
28ec0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
28ed0 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
28ee0 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   }.  TRACE(("BAL
28ef0 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64  ANCE: old: %d %d
28f00 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29   %d  new: %d(%d)
28f10 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
28f20 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
28f30 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c  .    pgnoOld[0],
28f40 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
28f50 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a  pgnoOld[1] : 0,.
28f60 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67      nOld>=3 ? pg
28f70 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20  noOld[2] : 0,.  
28f80 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a    pgnoNew[0], sz
28f90 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77  New[0],.    nNew
28fa0 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d  >=2 ? pgnoNew[1]
28fb0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
28fc0 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
28fd0 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f    nNew>=3 ? pgno
28fe0 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[2] : 0, nNew
28ff0 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
29000 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
29010 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30  ? pgnoNew[3] : 0
29020 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65  , nNew>=4 ? szNe
29030 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[3] : 0,.    nN
29040 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=5 ? pgnoNew[
29050 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20  4] : 0, nNew>=5 
29060 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29  ? szNew[4] : 0))
29070 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
29080 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
29090 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
290a0 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
290b0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
290c0 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
290d0 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
290e0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
290f0 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
29100 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
29110 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
29120 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
29130 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
29140 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
29150 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
29160 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
29170 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
29180 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d  rt( pNew->pgno==
29190 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20  pgnoNew[i] );.  
291a0 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
291b0 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
291c0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
291d0 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
291e0 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
291f0 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
29200 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
29210 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
29220 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
29230 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29240 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
29250 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  =0 );..    /* If
29260 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
29270 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
29280 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
29290 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
292a0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  .    ** that poi
292b0 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e  nt to the siblin
292c0 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65 61  gs that were rea
292d0 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63  rranged. These c
292e0 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20  an be: left.    
292f0 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63  ** children of c
29300 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d  ells, the right-
29310 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67  child of the pag
29320 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e, or overflow p
29330 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ages.    ** poin
29340 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e  ted to by cells.
29350 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29360 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
29370 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b        for(k=j; k
29380 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29  <cntNew[i]; k++)
29390 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
293a0 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( k<nMaxCells );
293b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72  .        if( aFr
293c0 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61  om[k]==0xFF || a
293d0 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d  pCopy[aFrom[k]]-
293e0 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
293f0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  o ){.          r
29400 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
29410 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20  l(pNew, k-j);.  
29420 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
29430 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61  SQLITE_OK && lea
29440 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29  fCorrection==0 )
29450 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
29460 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
29470 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
29480 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[k]), PTRMAP_BT
29490 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  REE, pNew->pgno)
294a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
294b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
294c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
294d0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
294e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
294f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29500 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
29510 20 7d 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e   }..    j = cntN
29520 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
29530 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
29540 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
29550 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
29560 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
29570 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
29580 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
29590 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
295a0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
295b0 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26   if( i<nNew-1 &&
295c0 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
295d0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
295e0 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
295f0 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
29600 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
29610 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
29620 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
29630 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
29640 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
29650 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
29660 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 32  pTemp = &aSpace2
29670 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20 20 20 20  [iSpace2];.     
29680 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
29690 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
296a0 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
296b0 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
296c0 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54         if( ISAUT
296d0 4f 56 41 43 55 55 4d 20 0a 20 20 20 20 20 20 20  OVACUUM .       
296e0 20 20 26 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d    && (aFrom[j]==
296f0 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
29700 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[j]]->pgno!=
29710 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a 20 20 20 20  pNew->pgno).    
29720 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
29730 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
29740 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
29750 65 6c 6c 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  ell), PTRMAP_BTR
29760 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  EE, pNew->pgno);
29770 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
29780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29790 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
297a0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
297b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
297c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
297d0 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
297e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
297f0 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20  f the tree is a 
29800 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20  leaf-data tree, 
29810 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  and the siblings
29820 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20   are leaves, .  
29830 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
29840 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65  ere is no divide
29850 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c  r cell in apCell
29860 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  []. Instead, the
29870 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20   divider .      
29880 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73    ** cell consis
29890 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ts of the intege
298a0 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69  r key for the ri
298b0 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66  ght-most cell of
298c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
298d0 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73   sibling-page as
298e0 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e  sembled above on
298f0 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ly..        */. 
29900 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
29910 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d  info;.        j-
29920 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  -;.        sqlit
29930 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
29940 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
29950 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  [j], &info);.   
29960 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
29970 6d 70 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c  mp;.        fill
29980 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
29990 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e  pCell, 0, info.n
299a0 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73  Key, 0, 0, 0, &s
299b0 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  z);.        pTem
299c0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
299d0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
299e0 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
299f0 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
29a00 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
29a10 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
29a20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
29a30 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
29a40 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
29a50 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
29a60 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
29a70 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
29a80 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
29a90 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
29aa0 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
29ab0 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
29ac0 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42  ** (see sqlite3B
29ad0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
29ae0 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74  (), 4 bytes is t
29af0 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
29b00 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  of.        ** an
29b10 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20  y cell). But it 
29b20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
29b30 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74  pass the correct
29b40 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20   size to .      
29b50 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28    ** insertCell(
29b60 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68  ), so reparse th
29b70 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20  e cell now..    
29b80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29b90 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
29ba0 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65   can never happe
29bb0 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  n in an SQLite d
29bc0 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c  ata file, as all
29bd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
29be0 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34  s are at least 4
29bf0 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20   bytes. It only 
29c00 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65  happens in b-tre
29c10 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20  es used.        
29c20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22  ** to evaluate "
29c30 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
29c40 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61   and similar cla
29c50 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  uses..        */
29c60 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
29c70 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20  ell[j]==4 ){.   
29c80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65         assert(le
29c90 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29  afCorrection==4)
29ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d  ;.          sz =
29cb0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
29cc0 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  rent, pCell);.  
29cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29ce0 20 20 20 20 20 20 69 53 70 61 63 65 32 20 2b 3d        iSpace2 +=
29cf0 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   sz;.      asser
29d00 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65  t( sz<=pBt->page
29d10 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20  Size/4 );.      
29d20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 32 3c  assert( iSpace2<
29d30 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
29d40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  ;.      rc = ins
29d50 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
29d60 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73   nxDiv, pCell, s
29d70 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20  z, pTemp, 4);.  
29d80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29d90 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
29da0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
29db0 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
29dc0 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
29dd0 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e  arent,nxDiv), pN
29de0 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  ew->pgno);..    
29df0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
29e00 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
29e10 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74  atabase, and not
29e20 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
29e30 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e,.      ** then
29e40 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
29e50 74 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20  ter map with an 
29e60 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
29e70 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
29e80 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65    ** that the ce
29e90 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ll just inserted
29ea0 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61   points to (if a
29eb0 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
29ec0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
29ed0 43 55 55 4d 20 26 26 20 21 6c 65 61 66 44 61 74  CUUM && !leafDat
29ee0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  a ){.        rc 
29ef0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
29f00 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b  pParent, nxDiv);
29f10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
29f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29f30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
29f40 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
29f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29f60 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
29f70 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a   nxDiv++;.    }.
29f80 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
29f90 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
29fa0 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69  y for the new si
29fb0 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
29fc0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
29fd0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  UUM ){.      rc 
29fe0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
29ff0 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52   pNew->pgno, PTR
2a000 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
2a010 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt->pgno);.     
2a020 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a030 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2a040 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2a050 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  up;.      }.    
2a060 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
2a070 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
2a080 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
2a090 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
2a0a0 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
2a0b0 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
2a0c0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a  ==0 ){.    u8 *z
2a0d0 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b  Child = &apCopy[
2a0e0 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nOld-1]->aData[8
2a0f0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  ];.    memcpy(&a
2a100 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44  pNew[nNew-1]->aD
2a110 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20  ata[8], zChild, 
2a120 34 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55  4);.    if( ISAU
2a130 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2a140 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2a150 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 7a  (pBt, get4byte(z
2a160 43 68 69 6c 64 29 2c 20 50 54 52 4d 41 50 5f 42  Child), PTRMAP_B
2a170 54 52 45 45 2c 20 61 70 4e 65 77 5b 6e 4e 65 77  TREE, apNew[nNew
2a180 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  -1]->pgno);.    
2a190 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a1a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
2a1b0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2a1c0 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nup;.      }.   
2a1d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44   }.  }.  if( nxD
2a1e0 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  iv==pParent->nCe
2a1f0 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  ll+pParent->nOve
2a200 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20  rflow ){.    /* 
2a210 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
2a220 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ng is the right-
2a230 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
2a240 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74  arent */.    put
2a250 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
2a260 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2a270 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
2a280 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
2a290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
2a2a0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
2a2b0 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68  g is the left ch
2a2c0 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74  ild of the first
2a2d0 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e   entry in pParen
2a2e0 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  t.    ** past th
2a2f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76  e right-most div
2a300 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ider entry */.  
2a310 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
2a320 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
2a330 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e  ent, nxDiv), pgn
2a340 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
2a350 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61   }..  /*.  ** Ba
2a360 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
2a370 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61   page.  Note tha
2a380 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
2a390 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74  ge (pPage) might
2a3a0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
2a3b0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
2a3c0 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68  elist so it migh
2a3d0 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69  t no longer be i
2a3e0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
2a3f0 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20   But the parent 
2a400 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  page will always
2a410 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
2a420 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2a430 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20  pParent->isInit 
2a440 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  );.  sqlite3Scra
2a450 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  tchFree(apCell);
2a460 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20  .  apCell = 0;. 
2a470 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2a480 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ge);.  pCur->iPa
2a490 67 65 2d 2d 3b 0a 20 20 72 63 20 3d 20 62 61 6c  ge--;.  rc = bal
2a4a0 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20  ance(pCur, 0);. 
2a4b0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61   .  /*.  ** Clea
2a4c0 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
2a4d0 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
2a4e0 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
2a4f0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 61 53  lite3PageFree(aS
2a500 70 61 63 65 32 29 3b 0a 20 20 73 71 6c 69 74 65  pace2);.  sqlite
2a510 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
2a520 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
2a530 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
2a540 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
2a550 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
2a560 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
2a570 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
2a580 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
2a590 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 6c 65  ;.  }..  /* rele
2a5a0 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29  asePage(pParent)
2a5b0 3b 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 42  ; */.  TRACE(("B
2a5c0 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
2a5d0 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64   with %d: old=%d
2a5e0 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64   new=%d cells=%d
2a5f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
2a600 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64  Page->pgno, nOld
2a610 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
2a620 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2a630 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2a640 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
2a650 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
2a660 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e   of a btree when
2a670 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
2a680 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
2a690 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e  lls.  This is an
2a6a0 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
2a6b0 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a  make the tree.**
2a6c0 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e   shallower by on
2a6d0 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  e level..*/.stat
2a6e0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73  ic int balance_s
2a6f0 68 61 6c 6c 6f 77 65 72 28 42 74 43 75 72 73 6f  hallower(BtCurso
2a700 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2a710 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
2a720 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
2a730 20 70 61 67 65 20 6f 66 20 42 2d 54 72 65 65 20   page of B-Tree 
2a740 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
2a750 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
2a760 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68    /* The only ch
2a770 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67  ild page of pPag
2a780 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2a790 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
2a7a0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2a7b0 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f  er for pChild */
2a7c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a7d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2a7e0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
2a7f0 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
2a800 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  s */.  BtShared 
2a810 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
2a820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2a830 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75  in BTree structu
2a840 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65  re */.  int mxCe
2a850 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20  llPerPage;      
2a860 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2a870 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2a880 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  per page */.  u8
2a890 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20   **apCell;      
2a8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2a8b0 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67  l cells from pag
2a8c0 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  es being balance
2a8d0 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
2a8e0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2a8f0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
2a900 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
2a910 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  /..  assert( pCu
2a920 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20  r->iPage==0 );. 
2a930 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2a940 70 50 61 67 65 5b 30 5d 3b 0a 0a 20 20 61 73 73  pPage[0];..  ass
2a950 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2a960 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2a970 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2a980 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2a990 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74  >mutex) );.  pBt
2a9a0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2a9b0 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d   mxCellPerPage =
2a9c0 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20   MX_CELL(pBt);. 
2a9d0 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
2a9e0 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50  3Malloc( mxCellP
2a9f0 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
2aa00 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29  8*)+sizeof(u16))
2aa10 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
2aa20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2aa30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
2aa40 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
2aa50 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
2aa60 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
2aa70 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
2aa80 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
2aa90 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
2aaa0 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
2aab0 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
2aac0 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
2aad0 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
2aae0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
2aaf0 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
2ab00 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
2ab10 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
2ab20 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
2ab30 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
2ab40 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
2ab50 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
2ab60 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
2ab70 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
2ab80 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
2ab90 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
2aba0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2abb0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2abc0 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
2abd0 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
2abe0 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
2abf0 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
2ac00 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
2ac10 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
2ac20 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2ac30 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
2ac40 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
2ac50 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
2ac60 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
2ac70 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
2ac80 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
2ac90 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
2aca0 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
2acb0 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
2acc0 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
2acd0 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
2ace0 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
2acf0 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
2ad00 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
2ad10 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
2ad20 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
2ad30 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
2ad40 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
2ad50 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
2ad60 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
2ad70 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 56  ee..    */.    V
2ad80 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70  VA_ONLY( pCur->p
2ad90 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31  agesShuffled = 1
2ada0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   );.    pgnoChil
2adb0 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  d = get4byte(&pP
2adc0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2add0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2ade0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2adf0 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20  oChild>0 );.    
2ae00 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
2ae10 64 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  d<=pagerPagecoun
2ae20 74 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  t(pPage->pBt->pP
2ae30 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
2ae40 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2ae50 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74  tPage(pPage->pBt
2ae60 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43  , pgnoChild, &pC
2ae70 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66  hild, 0);.    if
2ae80 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2ae90 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
2aea0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2aeb0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
2aec0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2aed0 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
2aee0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
2aef0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c   ) goto end_shal
2af00 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
2af10 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c     assert( pChil
2af20 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  d->nOverflow==0 
2af30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  );.      if( pCh
2af40 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20  ild->nFree>=100 
2af50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2af60 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74  e child informat
2af70 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ion will fit on 
2af80 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73  the root page, s
2af90 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20  o do the.       
2afa0 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20   ** copy */.    
2afb0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2afc0 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2afd0 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
2afe0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
2aff0 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d  r(i=0; i<pChild-
2b000 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
2b010 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69          apCell[i
2b020 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68  ] = findCell(pCh
2b030 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20  ild,i);.        
2b040 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65    szCell[i] = ce
2b050 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64  llSizePtr(pChild
2b060 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20  , apCell[i]);.  
2b070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b080 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61  assemblePage(pPa
2b090 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ge, pChild->nCel
2b0a0 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  l, apCell, szCel
2b0b0 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l);.        /* C
2b0c0 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f  opy the right-po
2b0d0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
2b0e0 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ld to the parent
2b0f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
2b100 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2b110 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2b120 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20  fset+8], .      
2b130 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
2b140 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43  pChild->aData[pC
2b150 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b  hild->hdrOffset+
2b160 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72  8]));.        fr
2b170 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
2b180 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2b190 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
2b1a0 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61  d transfer to pa
2b1b0 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
2b1c0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
2b1d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2b1e0 20 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d   The child has m
2b1f0 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
2b200 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  that will fit on
2b210 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20   the root..     
2b220 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69     ** The tree i
2b230 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63  s already balanc
2b240 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e  ed.  Do nothing.
2b250 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43   */.        TRAC
2b260 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
2b270 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66  ld %d will not f
2b280 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c  it on page 1\n",
2b290 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2b2a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2b2b0 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  se{.      memcpy
2b2c0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70  (pPage->aData, p
2b2d0 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50  Child->aData, pP
2b2e0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2b2f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
2b300 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2b310 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b320 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2b330 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 61 73  pPage);.      as
2b340 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2b350 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65  _OK );.      fre
2b360 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2b370 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
2b380 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63  ANCE: transfer c
2b390 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f  hild %d into roo
2b3a0 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t %d\n",.       
2b3b0 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70         pChild->p
2b3c0 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  gno, pPage->pgno
2b3d0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ));.    }.    as
2b3e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2b3f0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66  erflow==0 );.#if
2b400 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b410 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2b420 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2b430 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2b440 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
2b450 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
2b460 64 69 66 0a 20 20 20 20 72 65 6c 65 61 73 65 50  dif.    releaseP
2b470 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d  age(pChild);.  }
2b480 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c  .end_shallow_bal
2b490 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f  ance:.  sqlite3_
2b4a0 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  free(apCell);.  
2b4b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2b4c0 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61  *.** The root pa
2b4d0 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a  ge is overfull.*
2b4e0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68  *.** When this h
2b4f0 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61  appens, Create a
2b500 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
2b510 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20  and copy the.** 
2b520 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b530 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68  root into the ch
2b540 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20  ild.  Then make 
2b550 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
2b560 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
2b570 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70  ith rightChild p
2b580 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e  ointing to the n
2b590 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46  ew.** child.   F
2b5a0 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c  inally, call bal
2b5b0 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20  ance_internal() 
2b5c0 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  on the new child
2b5d0 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20  .** to cause it 
2b5e0 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61  to split..*/.sta
2b5f0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2b600 64 65 65 70 65 72 28 42 74 43 75 72 73 6f 72 20  deeper(BtCursor 
2b610 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
2b620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2b630 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
2b640 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
2b650 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2b660 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69  Page;     /* Poi
2b670 6e 74 65 72 20 74 6f 20 74 68 65 20 72 6f 6f 74  nter to the root
2b680 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   page */.  MemPa
2b690 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f  ge *pChild;    /
2b6a0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
2b6b0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
2b6c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2b6d0 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  d;     /* Page n
2b6e0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
2b6f0 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
2b700 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2b710 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
2b720 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  Tree */.  int us
2b730 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  ableSize;     /*
2b740 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69   Total usable si
2b750 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a  ze of a page */.
2b760 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2b770 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2b780 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
2b790 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61  age */.  u8 *cda
2b7a0 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
2b7b0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  Content of the c
2b7c0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  hild page */.  i
2b7d0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
2b7e0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2b7f0 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70  page header in p
2b800 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
2b810 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  brk;           /
2b820 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74  * Offset to cont
2b830 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ent of first cel
2b840 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a  l in parent */..
2b850 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b860 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73  iPage==0 );.  as
2b870 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2b880 67 65 5b 30 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ge[0]->nOverflow
2b890 3e 30 20 29 3b 0a 0a 20 20 56 56 41 5f 4f 4e 4c  >0 );..  VVA_ONL
2b8a0 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  Y( pCur->pagesSh
2b8b0 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20  uffled = 1 );.  
2b8c0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2b8d0 50 61 67 65 5b 30 5d 3b 0a 20 20 70 42 74 20 3d  Page[0];.  pBt =
2b8e0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61   pPage->pBt;.  a
2b8f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2b900 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2b910 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
2b920 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2b930 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20  e(pBt, &pChild, 
2b940 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67  &pgnoChild, pPag
2b950 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69  e->pgno, 0);.  i
2b960 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b970 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
2b980 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2b990 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62  able(pChild->pDb
2b9a0 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c  Page) );.  usabl
2b9b0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
2b9c0 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20  bleSize;.  data 
2b9d0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2b9e0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
2b9f0 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 62 72 6b  drOffset;.  cbrk
2ba00 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
2ba10 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61  a[hdr+5]);.  cda
2ba20 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61  ta = pChild->aDa
2ba30 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61  ta;.  memcpy(cda
2ba40 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20  ta, &data[hdr], 
2ba50 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2ba60 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  t+2*pPage->nCell
2ba70 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28  -hdr);.  memcpy(
2ba80 26 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64  &cdata[cbrk], &d
2ba90 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c  ata[cbrk], usabl
2baa0 65 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 20 20 0a  eSize-cbrk);.  .
2bab0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2bac0 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69  reeInitPage(pChi
2bad0 6c 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ld);.  if( rc==S
2bae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2baf0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 50 61 67  int nCopy = pPag
2bb00 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a  e->nOverflow*siz
2bb10 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
2bb20 5b 30 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  [0]);.    memcpy
2bb30 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20  (pChild->aOvfl, 
2bb40 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 6e 43  pPage->aOvfl, nC
2bb50 6f 70 79 29 3b 0a 20 20 20 20 70 43 68 69 6c 64  opy);.    pChild
2bb60 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50  ->nOverflow = pP
2bb70 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  age->nOverflow;.
2bb80 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e      if( pChild->
2bb90 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
2bba0 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65     pChild->nFree
2bbb0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
2bbc0 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
2bbd0 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43  nCell==pPage->nC
2bbe0 65 6c 6c 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  ell );.    zeroP
2bbf0 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
2bc00 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50  d->aData[0] & ~P
2bc10 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 70 75  TF_LEAF);.    pu
2bc20 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2bc30 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2bc40 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68  ffset+8], pgnoCh
2bc50 69 6c 64 29 3b 0a 20 20 20 20 54 52 41 43 45 28  ild);.    TRACE(
2bc60 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
2bc70 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
2bc80 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2bc90 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2bca0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2bcb0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
2bcc0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2bcd0 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c  t, pChild->pgno,
2bce0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2bcf0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66  Page->pgno);.#if
2bd00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2bd10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2bd20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bd30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2bd40 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
2bd50 61 70 73 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  aps(pChild);.   
2bd60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2bd70 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
2bd80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bd90 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
2bda0 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
2bdb0 65 5b 31 5d 20 3d 20 70 43 68 69 6c 64 3b 0a 20  e[1] = pChild;. 
2bdc0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30     pCur->aiIdx[0
2bdd0 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  ] = 0;.    rc = 
2bde0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2bdf0 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
2be00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2be10 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  pChild);.  }..  
2be20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2be30 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61  .** The page tha
2be40 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79  t pCur currently
2be50 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a   points to has j
2be60 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ust been modifie
2be70 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79  d in.** some way
2be80 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2be90 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74  figures out if t
2bea0 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  his modification
2beb0 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72   means the.** tr
2bec0 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ee needs to be b
2bed0 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20  alanced, and if 
2bee0 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70  so calls the app
2bef0 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69  ropriate balanci
2bf00 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a  ng .** routine..
2bf10 2a 2a 20 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ** .** Parameter
2bf20 20 69 73 49 6e 73 65 72 74 20 69 73 20 74 72 75   isInsert is tru
2bf30 65 20 69 66 20 61 20 6e 65 77 20 63 65 6c 6c 20  e if a new cell 
2bf40 77 61 73 20 6a 75 73 74 20 69 6e 73 65 72 74 65  was just inserte
2bf50 64 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 70 61  d into the.** pa
2bf60 67 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  ge, or false oth
2bf70 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
2bf80 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
2bf90 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2bfa0 74 20 69 73 49 6e 73 65 72 74 29 7b 0a 20 20 69  t isInsert){.  i
2bfb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2bfc0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
2bfd0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2bfe0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2bff0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2c000 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2c010 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2c020 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
2c030 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2c040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c050 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2c060 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2c070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c080 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
2c090 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ow>0 ){.      rc
2c0a0 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65   = balance_deepe
2c0b0 72 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  r(pCur);.    }. 
2c0c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c0d0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e  E_OK && pPage->n
2c0e0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
2c0f0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68   rc = balance_sh
2c100 61 6c 6c 6f 77 65 72 28 70 43 75 72 29 3b 0a 20  allower(pCur);. 
2c110 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2c120 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
2c130 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20  erflow>0 || .   
2c140 20 20 20 20 20 28 21 69 73 49 6e 73 65 72 74 20       (!isInsert 
2c150 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  && pPage->nFree>
2c160 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2c170 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20  leSize*2/3) ){. 
2c180 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2c190 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b  e_nonroot(pCur);
2c1a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2c1b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2c1c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
2c1d0 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73  ecks all cursors
2c1e0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
2c1f0 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  able pgnoRoot..*
2c200 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73  * If any of thos
2c210 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f  e cursors were o
2c220 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
2c230 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72  g==0 in a differ
2c240 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
2c250 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61  connection (a da
2c260 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2c270 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68  n that shares th
2c280 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65  e pager.** cache
2c290 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
2c2a0 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e  t connection) an
2c2b0 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e  d that other con
2c2c0 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e  nection .** is n
2c2d0 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e  ot in the ReadUn
2c2e0 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65  commmitted state
2c2f0 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
2c300 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ine returns .** 
2c310 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a  SQLITE_LOCKED..*
2c320 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20  *.** As well as 
2c330 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46  cursors with wrF
2c340 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20  lag==0, cursors 
2c350 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 20 61  with wrFlag==1 a
2c360 6e 64 20 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f  nd .** isIncrblo
2c370 62 48 61 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61  bHandle==1 are a
2c380 6c 73 6f 20 63 6f 6e 73 69 64 65 72 65 64 20 27  lso considered '
2c390 72 65 61 64 27 20 63 75 72 73 6f 72 73 2e 20 49  read' cursors. I
2c3a0 6e 63 72 65 6d 65 6e 74 61 6c 20 0a 2a 2a 20 62  ncremental .** b
2c3b0 6c 6f 62 20 63 75 72 73 6f 72 73 20 61 72 65 20  lob cursors are 
2c3c0 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65  used for both re
2c3d0 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e  ading and writin
2c3e0 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67  g..**.** When pg
2c3f0 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f  noRoot is the ro
2c400 6f 74 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e  ot page of an in
2c410 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73  tkey table, this
2c420 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73   function is als
2c430 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65  o.** responsible
2c440 20 66 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e   for invalidatin
2c450 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  g incremental bl
2c460 6f 62 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20  ob cursors when 
2c470 74 68 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a  the table row.**
2c480 20 6f 6e 20 77 68 69 63 68 20 74 68 65 79 20 61   on which they a
2c490 72 65 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c  re opened is del
2c4a0 65 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64  eted or modified
2c4b0 2e 20 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e  . Cursors are in
2c4c0 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63  validated.** acc
2c4d0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f  ording to the fo
2c4e0 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  llowing rules:.*
2c4f0 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42  *.**   1) When B
2c500 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
2c510 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
2c520 6d 70 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20  mpletely delete 
2c530 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
2c540 20 20 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65       of a B-Tree
2c550 20 74 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65   table, pExclude
2c560 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20   is set to zero 
2c570 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52  and parameter iR
2c580 6f 77 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73  ow is .**      s
2c590 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  et to non-zero. 
2c5a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
2c5b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2c5c0 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a  b cursors open.*
2c5d0 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61  *      on the ta
2c5e0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67  ble rooted at pg
2c5f0 6e 6f 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c  noRoot are inval
2c600 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  idated..**.**   
2c610 32 29 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73  2) When BtreeIns
2c620 65 72 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65  ert(), BtreeDele
2c630 74 65 28 29 20 6f 72 20 42 74 72 65 65 50 75 74  te() or BtreePut
2c640 44 61 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64  Data() is called
2c650 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64   to .**      mod
2c660 69 66 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20  ify a table row 
2c670 76 69 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65  via an SQL state
2c680 6d 65 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69  ment, pExclude i
2c690 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
2c6a0 20 20 20 20 20 20 77 72 69 74 65 20 63 75 72 73        write curs
2c6b0 6f 72 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68  or used to do th
2c6c0 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61  e modification a
2c6d0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f  nd parameter iRo
2c6e0 77 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20  w is set.**     
2c6f0 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20   to the integer 
2c700 72 6f 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d  row id of the B-
2c710 54 72 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67  Tree entry being
2c720 20 6d 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73   modified. Unles
2c730 73 0a 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75  s.**      pExclu
2c740 64 65 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20  de is itself an 
2c750 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2c760 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c   cursor, then al
2c770 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a  l incremental.**
2c780 20 20 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f        blob curso
2c790 72 73 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69  rs open on row i
2c7a0 52 6f 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65  Row of the B-Tre
2c7b0 65 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  e are invalidate
2c7c0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66  d..**.**   3) If
2c7d0 20 62 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61   both pExclude a
2c7e0 6e 64 20 69 52 6f 77 20 61 72 65 20 73 65 74 20  nd iRow are set 
2c7f0 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72  to zero, no incr
2c800 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a  emental blob .**
2c810 20 20 20 20 20 20 63 75 72 73 6f 72 73 20 61 72        cursors ar
2c820 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
2c830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
2c840 63 6b 52 65 61 64 4c 6f 63 6b 73 28 0a 20 20 42  ckReadLocks(.  B
2c850 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 0a 20  tree *pBtree, . 
2c860 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20   Pgno pgnoRoot, 
2c870 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
2c880 63 6c 75 64 65 2c 0a 20 20 69 36 34 20 69 52 6f  clude,.  i64 iRo
2c890 77 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  w.){.  BtCursor 
2c8a0 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  *p;.  BtShared *
2c8b0 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42  pBt = pBtree->pB
2c8c0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2c8d0 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20   = pBtree->db;. 
2c8e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c8f0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2c900 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72  pBtree) );.  for
2c910 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
2c920 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
2c930 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63  .    if( p==pExc
2c940 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lude ) continue;
2c950 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
2c960 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Root!=pgnoRoot )
2c970 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64   continue;.#ifnd
2c980 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
2c990 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20  NCRBLOB.    if( 
2c9a0 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  p->isIncrblobHan
2c9b0 64 6c 65 20 26 26 20 28 20 0a 20 20 20 20 20 20  dle && ( .      
2c9c0 20 20 20 28 21 70 45 78 63 6c 75 64 65 20 26 26     (!pExclude &&
2c9d0 20 69 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20   iRow).      || 
2c9e0 28 70 45 78 63 6c 75 64 65 20 26 26 20 21 70 45  (pExclude && !pE
2c9f0 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c  xclude->isIncrbl
2ca00 6f 62 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69  obHandle && p->i
2ca10 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a  nfo.nKey==iRow).
2ca20 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d      )){.      p-
2ca30 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2ca40 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a  _INVALID;.    }.
2ca50 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
2ca60 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2ca70 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75  _VALID ) continu
2ca80 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72  e;.    if( p->wr
2ca90 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66  Flag==0 .#ifndef
2caa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2cab0 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d  RBLOB.     || p-
2cac0 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2cad0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a  e.#endif.    ){.
2cae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2caf0 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72  bOther = p->pBtr
2cb00 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 69 66  ee->db;.      if
2cb10 28 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a  ( dbOther==0 ||.
2cb20 20 20 20 20 20 20 20 20 20 28 64 62 4f 74 68 65           (dbOthe
2cb30 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65  r!=db && (dbOthe
2cb40 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  r->flags & SQLIT
2cb50 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2cb60 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  d)==0) ){.      
2cb70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cb80 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a  LOCKED;.      }.
2cb90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2cba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2cbb0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
2cbc0 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
2cbd0 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20  the BTree.  The 
2cbe0 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20  key is given by 
2cbf0 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61  (pKey,nKey).** a
2cc00 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67  nd the data is g
2cc10 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e  iven by (pData,n
2cc20 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73  Data).  The curs
2cc30 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  or is used only 
2cc40 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61  to.** define wha
2cc50 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f  t table the reco
2cc60 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rd should be ins
2cc70 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65  erted into.  The
2cc80 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
2cc90 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2cca0 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
2ccb0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49  ..**.** For an I
2ccc0 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c  NTKEY table, onl
2ccd0 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65  y the nKey value
2cce0 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75   of the key is u
2ccf0 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a  sed.  pKey is.**
2cd00 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61   ignored.  For a
2cd10 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c   ZERODATA table,
2cd20 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e   the pData and n
2cd30 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67  Data are both ig
2cd40 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
2cd50 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
2cd60 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
2cd70 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
2cd80 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
2cd90 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65  a into the table
2cda0 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   of this cursor 
2cdb0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2cdc0 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
2cdd0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f      /* The key o
2cde0 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2cdf0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2ce00 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
2ce10 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61  ta,  /* The data
2ce20 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
2ce30 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  rd */.  int nZer
2ce40 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
2ce50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ce60 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74 65   of extra 0 byte
2ce70 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64  s to append to d
2ce80 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70  ata */.  int app
2ce90 65 6e 64 42 69 61 73 20 20 20 20 20 20 20 20 20  endBias         
2cea0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2ceb0 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c  if this is likel
2cec0 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29  y an append */.)
2ced0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
2cee0 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e  t loc;.  int szN
2cef0 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  ew;.  int idx;. 
2cf00 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2cf10 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
2cf20 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
2cf30 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2cf40 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
2cf50 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a   char *oldCell;.
2cf60 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2cf70 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20  *newCell = 0;.. 
2cf80 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2cf90 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2cfa0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
2cfb0 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41  Transaction!=TRA
2cfc0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2cfd0 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20  /* Must start a 
2cfe0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
2cff0 72 65 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65  re doing an inse
2d000 72 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  rt */.    rc = p
2d010 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2d020 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2d030 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2d040 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d050 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2d060 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2d070 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61  if( !pCur->wrFla
2d080 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
2d090 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f  SQLITE_PERM;   /
2d0a0 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65  * Cursor not ope
2d0b0 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f  n for writing */
2d0c0 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b  .  }.  if( check
2d0d0 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e  ReadLocks(pCur->
2d0e0 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67  pBtree, pCur->pg
2d0f0 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b  noRoot, pCur, nK
2d100 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ey) ){.    retur
2d110 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2d120 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
2d130 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
2d140 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
2d150 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
2d160 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
2d170 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
2d180 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
2d190 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
2d1a0 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
2d1b0 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
2d1c0 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
2d1d0 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
2d1e0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
2d1f0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a 20  (pCur);.  if( . 
2d200 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
2d210 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2d220 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
2d230 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c  noRoot, pCur)) |
2d240 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21  |.    SQLITE_OK!
2d250 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  =(rc = sqlite3Bt
2d260 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
2d270 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65  pKey, nKey, appe
2d280 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20  ndBias, &loc)). 
2d290 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2d2a0 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20  c;.  }..  pPage 
2d2b0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2d2c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
2d2d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
2d2e0 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
2d2f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2d300 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
2d310 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
2d320 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
2d330 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
2d340 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
2d350 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
2d360 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2d370 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
2d380 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
2d390 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
2d3a0 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
2d3b0 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
2d3c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d3d0 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f  isInit );.  allo
2d3e0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
2d3f0 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20  t);.  newCell = 
2d400 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
2d410 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30    if( newCell==0
2d420 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2d430 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66  _NOMEM;.  rc = f
2d440 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c  illInCell(pPage,
2d450 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20   newCell, pKey, 
2d460 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61  nKey, pData, nDa
2d470 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65  ta, nZero, &szNe
2d480 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  w);.  if( rc ) g
2d490 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2d4a0 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d    assert( szNew=
2d4b0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
2d4c0 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a  ge, newCell) );.
2d4d0 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c    assert( szNew<
2d4e0 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42  =MX_CELL_SIZE(pB
2d4f0 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43  t) );.  idx = pC
2d500 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d510 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f  iPage];.  if( lo
2d520 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56  c==0 && CURSOR_V
2d530 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2d540 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a  te ){.    u16 sz
2d550 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Old;.    assert(
2d560 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
2d570 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  l );.    rc = sq
2d580 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d590 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2d5a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2d5b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e       goto end_in
2d5c0 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sert;.    }.    
2d5d0 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65  oldCell = findCe
2d5e0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  ll(pPage, idx);.
2d5f0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2d600 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65  leaf ){.      me
2d610 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c  mcpy(newCell, ol
2d620 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d  dCell, 4);.    }
2d630 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c  .    szOld = cel
2d640 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2d650 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63  oldCell);.    rc
2d660 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
2d670 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
2d680 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2d690 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
2d6a0 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50  rc = dropCell(pP
2d6b0 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 29  age, idx, szOld)
2d6c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2d6d0 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
2d6e0 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
2d6f0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
2d700 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50   if( loc<0 && pP
2d710 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  age->nCell>0 ){.
2d720 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d730 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69  e->leaf );.    i
2d740 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
2d750 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2d760 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
2d770 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
2d780 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
2d790 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2d7a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d7b0 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
2d7c0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2d7d0 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c  age, idx, newCel
2d7e0 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
2d7f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2d800 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
2d810 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62  insert;.  rc = b
2d820 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 31 29 3b  alance(pCur, 1);
2d830 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2d840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
2d850 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2d860 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20  }.end_insert:.  
2d870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2d880 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65  .** Delete the e
2d890 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75  ntry that the cu
2d8a0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
2d8b0 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72   to.  The cursor
2d8c0 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2d8d0 74 69 6e 67 20 61 74 20 61 20 61 72 62 69 74 72  ting at a arbitr
2d8e0 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  ary location..*/
2d8f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2d900 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
2d910 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2d920 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2d930 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2d940 50 61 67 65 5d 3b 0a 20 20 69 6e 74 20 69 64 78  Page];.  int idx
2d950 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2d960 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  r *pCell;.  int 
2d970 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43  rc;.  Pgno pgnoC
2d980 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65  hild = 0;.  Btre
2d990 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
2d9a0 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
2d9b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
2d9c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2d9d0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2d9e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2d9f0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2da00 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
2da10 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57  saction!=TRANS_W
2da20 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d  RITE ){.    /* M
2da30 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
2da40 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64  saction before d
2da50 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f  oing a delete */
2da60 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
2da70 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2da80 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2da90 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
2daa0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2dab0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
2dac0 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70  dOnly );.  if( p
2dad0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2dae0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
2daf0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
2db00 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  ip;.  }.  if( pC
2db10 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2db20 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
2db30 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Cell ){.    retu
2db40 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2db50 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2db60 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2db70 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  to anything */. 
2db80 20 7d 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e   }.  if( !pCur->
2db90 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
2dba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2dbb0 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f  ;   /* Did not o
2dbc0 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20  pen this cursor 
2dbd0 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2dbe0 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
2dbf0 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42  adLocks(pCur->pB
2dc00 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
2dc10 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72  Root, pCur, pCur
2dc20 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a  ->info.nKey) ){.
2dc30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2dc40 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65  E_LOCKED; /* The
2dc50 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e   table pCur poin
2dc60 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64  ts to has a read
2dc70 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20   lock */.  }..  
2dc80 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  /* Restore the c
2dc90 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
2dca0 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20  sition (a no-op 
2dcb0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2dcc0 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55   not in .  ** CU
2dcd0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2dce0 20 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65   state) and save
2dcf0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
2dd00 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
2dd10 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f  ors .  ** open o
2dd20 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
2dd30 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69  . Then call sqli
2dd40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2dd50 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a  on the page.  **
2dd60 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
2dd70 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
2dd80 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  from..  */.  if(
2dd90 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73 74   .    (rc = rest
2dda0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2ddb0 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20  n(pCur))!=0 ||. 
2ddc0 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c     (rc = saveAll
2ddd0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
2dde0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2ddf0 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
2de00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2de10 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2de20 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20  Page))!=0.  ){. 
2de30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2de40 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
2de50 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69  he cell within i
2de60 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  ts page and leav
2de70 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
2de80 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
2de90 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
2dea0 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
2deb0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2dec0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2ded0 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
2dee0 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
2def0 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
2df00 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43  .  */.  idx = pC
2df10 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2df20 69 50 61 67 65 5d 3b 0a 20 20 70 43 65 6c 6c 20  iPage];.  pCell 
2df30 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2df40 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70  , idx);.  if( !p
2df50 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2df60 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2df70 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
2df80 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43   }.  rc = clearC
2df90 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2dfa0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2dfb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2dfc0 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
2dfd0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a  >leaf ){.    /*.
2dfe0 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79      ** The entry
2dff0 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
2e000 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61   delete is not a
2e010 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64   leaf so if we d
2e020 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20  o not.    ** do 
2e030 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c  something we wil
2e040 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f  l leave a hole o
2e050 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61  n an internal pa
2e060 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61  ge..    ** We ha
2e070 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68  ve to fill the h
2e080 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e  ole by moving in
2e090 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c   a cell from a l
2e0a0 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  eaf.  The.    **
2e0b0 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72   next Cell after
2e0c0 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64   the one to be d
2e0d0 65 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e  eleted is guaran
2e0e0 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e  teed to exist an
2e0f0 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61  d.    ** to be a
2e100 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20   leaf so we can 
2e110 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  use it..    */. 
2e120 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66     BtCursor leaf
2e130 43 75 72 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  Cur;.    MemPage
2e140 20 2a 70 4c 65 61 66 50 61 67 65 3b 0a 0a 20 20   *pLeafPage;..  
2e150 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2e160 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20  *pNext;.    int 
2e170 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73  notUsed;.    uns
2e180 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
2e190 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  Cell = 0;.    as
2e1a0 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 69 6e  sert( !pPage->in
2e1b0 74 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69  tKey );.    sqli
2e1c0 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
2e1d0 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61  ursor(pCur, &lea
2e1e0 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  fCur);.    rc = 
2e1f0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2e200 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55  (&leafCur, &notU
2e210 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
2e220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e230 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
2e240 66 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66 43  fCur.aiIdx[leafC
2e250 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a  ur.iPage]==0 );.
2e260 20 20 20 20 20 20 70 4c 65 61 66 50 61 67 65 20        pLeafPage 
2e270 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  = leafCur.apPage
2e280 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b  [leafCur.iPage];
2e290 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2e2a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
2e2b0 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67 65  eafPage->pDbPage
2e2c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2e2d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e2e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 61 66  {.      int leaf
2e2f0 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20  CursorInvalid = 
2e300 30 3b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e  0;.      u16 szN
2e310 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ext;.      TRACE
2e320 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
2e330 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72  =%d delete inter
2e340 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c  nal from %d repl
2e350 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ace from leaf %d
2e360 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43  \n",.         pC
2e370 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
2e380 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66  age->pgno, pLeaf
2e390 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2e3a0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2e3b0 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ge, idx, cellSiz
2e3c0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2e3d0 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74  l));.      pNext
2e3e0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61   = findCell(pLea
2e3f0 66 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20  fPage, 0);.     
2e400 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69   szNext = cellSi
2e410 7a 65 50 74 72 28 70 4c 65 61 66 50 61 67 65 2c  zePtr(pLeafPage,
2e420 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61   pNext);.      a
2e430 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
2e440 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74  IZE(pBt)>=szNext
2e450 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f  +4 );.      allo
2e460 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
2e470 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65  t);.      tempCe
2e480 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  ll = pBt->pTmpSp
2e490 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  ace;.      if( t
2e4a0 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  empCell==0 ){.  
2e4b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2e4c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2e4d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2e4e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e4f0 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43      rc = insertC
2e500 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
2e510 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b  pNext-4, szNext+
2e520 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b  4, tempCell, 0);
2e530 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
2e540 20 2f 2a 20 54 68 65 20 22 69 66 22 20 73 74 61   /* The "if" sta
2e550 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e 65  tement in the ne
2e560 78 74 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73  xt code block is
2e570 20 63 72 69 74 69 63 61 6c 2e 20 20 54 68 65 0a   critical.  The.
2e580 20 20 20 20 20 20 2a 2a 20 73 6c 69 67 68 74 65        ** slighte
2e590 73 74 20 65 72 72 6f 72 20 69 6e 20 74 68 61 74  st error in that
2e5a0 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64   statement would
2e5b0 20 61 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f   allow SQLite to
2e5c0 20 6f 70 65 72 61 74 65 0a 20 20 20 20 20 20 2a   operate.      *
2e5d0 2a 20 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74  * correctly most
2e5e0 20 6f 66 20 74 68 65 20 74 69 6d 65 20 62 75 74   of the time but
2e5f0 20 70 72 6f 64 75 63 65 20 76 65 72 79 20 72 61   produce very ra
2e600 72 65 20 66 61 69 6c 75 72 65 73 2e 20 20 54 6f  re failures.  To
2e610 0a 20 20 20 20 20 20 2a 2a 20 67 75 61 72 64 20  .      ** guard 
2e620 61 67 61 69 6e 73 74 20 74 68 69 73 2c 20 74 68  against this, th
2e630 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
2e640 6f 73 20 68 65 6c 70 20 74 6f 20 76 65 72 69 66  os help to verif
2e650 79 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  y that.      ** 
2e660 74 68 65 20 22 69 66 22 20 73 74 61 74 65 6d 65  the "if" stateme
2e670 6e 74 20 69 73 20 77 65 6c 6c 20 74 65 73 74 65  nt is well teste
2e680 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
2e690 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2e6a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2e6b0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
2e6c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
2e6d0 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20 20  2/3 .           
2e6e0 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
2e6f0 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
2e700 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
2e710 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
2e720 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2e730 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2e740 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d  && pPage->nFree=
2e750 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
2e760 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20  *2/3 .          
2e770 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
2e780 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
2e790 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
2e7a0 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
2e7b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
2e7c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
2e7d0 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
2e7e0 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ==pBt->usableSiz
2e7f0 65 2a 32 2f 33 2b 31 20 0a 20 20 20 20 20 20 20  e*2/3+1 .       
2e800 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
2e810 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
2e820 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
2e830 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
2e840 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e850 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2e860 3e 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  >0 && pPage->nFr
2e870 65 65 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ee<=pBt->usableS
2e880 69 7a 65 2a 32 2f 33 0a 20 20 20 20 20 20 20 20  ize*2/3.        
2e890 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61           && pLea
2e8a0 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
2e8b0 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61  zNext > pBt->usa
2e8c0 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20  bleSize*2/3 );. 
2e8d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
2e8e0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2e8f0 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46  >0 || (pPage->nF
2e900 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ree > pBt->usabl
2e910 65 53 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20  eSize*2/3)).    
2e920 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2e930 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
2e940 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74  +2+szNext == pBt
2e950 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2e960 20 29 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28 20   );...      if( 
2e970 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  (pPage->nOverflo
2e980 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e  w>0 || (pPage->n
2e990 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62  Free > pBt->usab
2e9a0 6c 65 53 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a  leSize*2/3)) &&.
2e9b0 20 20 20 20 20 20 20 20 20 20 28 70 4c 65 61 66            (pLeaf
2e9c0 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
2e9d0 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
2e9e0 6c 65 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20  leSize*2/3).    
2e9f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
2ea00 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2ea10 61 6b 65 6e 20 69 66 20 74 68 65 20 69 6e 74 65  aken if the inte
2ea20 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77  rnal node is now
2ea30 20 65 69 74 68 65 72 20 6f 76 65 72 66 6c 6f 77   either overflow
2ea40 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ing.        ** o
2ea50 72 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20  r underfull and 
2ea60 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69  the leaf node wi
2ea70 6c 6c 20 62 65 20 75 6e 64 65 72 66 75 6c 6c 20  ll be underfull 
2ea80 61 66 74 65 72 20 74 68 65 20 6a 75 73 74 20 63  after the just c
2ea90 65 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ell .        ** 
2eaa0 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 69 6e  copied to the in
2eab0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64  ternal node is d
2eac0 65 6c 65 74 65 64 20 66 72 6f 6d 20 69 74 2e 20  eleted from it. 
2ead0 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61  This is a specia
2eae0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  l.        ** cas
2eaf0 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  e because the ca
2eb00 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20  ll to balance() 
2eb10 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20 69  to correct the i
2eb20 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20  nternal node.   
2eb30 20 20 20 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e       ** may chan
2eb40 67 65 20 74 68 65 20 74 72 65 65 20 73 74 72 75  ge the tree stru
2eb50 63 74 75 72 65 20 61 6e 64 20 69 6e 76 61 6c 69  cture and invali
2eb60 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
2eb70 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
2eb80 74 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61  the leafCur.apPa
2eb90 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72  ge[] and leafCur
2eba0 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 2c  .aiIdx[] arrays,
2ebb0 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 20   which will be. 
2ebc0 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62         ** used b
2ebd0 79 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  y the balance() 
2ebe0 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 72 72  required to corr
2ebf0 65 63 74 20 74 68 65 20 75 6e 64 65 72 66 75 6c  ect the underful
2ec00 6c 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a  l leaf.        *
2ec10 2a 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  * node..        
2ec20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
2ec30 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 69  e formula used i
2ec40 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2ec50 20 61 62 6f 76 65 20 61 72 65 20 62 61 73 65 64   above are based
2ec60 20 6f 6e 20 66 61 63 65 74 73 20 6f 66 0a 20 20   on facets of.  
2ec70 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
2ec80 69 74 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20  ite file-format 
2ec90 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e  that do not chan
2eca0 67 65 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20  ge over time..  
2ecb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ecc0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2ecd0 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73  ->nFree==pBt->us
2ece0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29  ableSize*2/3+1 )
2ecf0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2ed00 73 65 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e  se( pLeafPage->n
2ed10 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70  Free+2+szNext==p
2ed20 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2ed30 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  /3+1 );.        
2ed40 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
2ed50 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 20  d = 1;.      }  
2ed60 20 20 20 20 20 20 0a 0a 20 20 20 20 20 20 69 66        ..      if
2ed70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ed80 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
2ed90 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
2eda0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
2edb0 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
2edc0 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
2edd0 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66  pCur->pagesShuff
2ede0 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 20 20 20  led = 0 );.     
2edf0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2ee00 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  pCur, 0);.      
2ee10 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  }..      if( rc=
2ee20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65  =SQLITE_OK && le
2ee30 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20  afCursorInvalid 
2ee40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2ee50 65 20 6c 65 61 66 2d 6e 6f 64 65 20 69 73 20 6e  e leaf-node is n
2ee60 6f 77 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64  ow underfull and
2ee70 20 73 6f 20 74 68 65 20 74 72 65 65 20 6e 65 65   so the tree nee
2ee80 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 20 20  ds to be .      
2ee90 20 20 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e    ** rebalanced.
2eea0 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 62 61   However, the ba
2eeb0 6c 61 6e 63 65 28 29 20 6f 70 65 72 61 74 69 6f  lance() operatio
2eec0 6e 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  n on the interna
2eed0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 64  l.        ** nod
2eee0 65 20 61 62 6f 76 65 20 6d 61 79 20 68 61 76 65  e above may have
2eef0 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 73 74   modified the st
2ef00 72 75 63 74 75 72 65 20 6f 66 20 74 68 65 20 42  ructure of the B
2ef10 2d 54 72 65 65 20 61 6e 64 0a 20 20 20 20 20 20  -Tree and.      
2ef20 20 20 2a 2a 20 73 6f 20 74 68 65 20 63 75 72 72    ** so the curr
2ef30 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
2ef40 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 5d  leafCur.apPage[]
2ef50 20 61 6e 64 20 6c 65 61 66 43 75 72 2e 61 69 49   and leafCur.aiI
2ef60 64 78 5b 5d 0a 20 20 20 20 20 20 20 20 2a 2a 20  dx[].        ** 
2ef70 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2ef80 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
2ef90 20 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20         ** It is 
2efa0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2efb0 63 6f 70 79 20 74 68 65 20 61 6e 63 65 73 74 72  copy the ancestr
2efc0 79 20 66 72 6f 6d 20 70 43 75 72 2c 20 61 73 20  y from pCur, as 
2efd0 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
2efe0 20 2a 2a 20 62 61 6c 61 6e 63 65 28 29 20 63 61   ** balance() ca
2eff0 6c 6c 20 68 61 73 20 69 6e 76 61 6c 69 64 61 74  ll has invalidat
2f000 65 64 20 74 68 65 20 70 43 75 72 2d 3e 61 70 50  ed the pCur->apP
2f010 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
2f020 5d 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 72  ].        ** arr
2f030 61 79 73 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  ays. .        **
2f040 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
2f050 63 61 6c 6c 20 74 6f 20 73 61 76 65 43 75 72 73  call to saveCurs
2f060 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 62 65 6c  orPosition() bel
2f070 6f 77 20 69 6e 74 65 72 6e 61 6c 6c 79 20 73 61  ow internally sa
2f080 76 65 73 20 74 68 65 20 0a 20 20 20 20 20 20 20  ves the .       
2f090 20 2a 2a 20 6b 65 79 20 74 68 61 74 20 6c 65 61   ** key that lea
2f0a0 66 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c  fCur is currentl
2f0b0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 43  y pointing to. C
2f0c0 75 72 72 65 6e 74 6c 79 2c 20 74 68 65 72 65 0a  urrently, there.
2f0d0 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 74          ** are t
2f0e0 77 6f 20 63 6f 70 69 65 73 20 6f 66 20 74 68 61  wo copies of tha
2f0f0 74 20 6b 65 79 20 69 6e 20 74 68 65 20 74 72 65  t key in the tre
2f100 65 20 2d 20 6f 6e 65 20 68 65 72 65 20 6f 6e 20  e - one here on 
2f110 74 68 65 20 6c 65 61 66 0a 20 20 20 20 20 20 20  the leaf.       
2f120 20 2a 2a 20 70 61 67 65 20 61 6e 64 20 6f 6e 65   ** page and one
2f130 20 6f 6e 20 73 6f 6d 65 20 69 6e 74 65 72 6e 61   on some interna
2f140 6c 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 74 72  l node in the tr
2f150 65 65 2e 20 54 68 65 20 63 6f 70 79 20 6f 6e 0a  ee. The copy on.
2f160 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c          ** the l
2f170 65 61 66 20 6e 6f 64 65 20 69 73 20 61 6c 77 61  eaf node is alwa
2f180 79 73 20 74 68 65 20 6e 65 78 74 20 6b 65 79 20  ys the next key 
2f190 69 6e 20 74 72 65 65 2d 6f 72 64 65 72 20 61 66  in tree-order af
2f1a0 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
2f1b0 20 2a 2a 20 63 6f 70 79 20 6f 6e 20 74 68 65 20   ** copy on the 
2f1c0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 53  internal node. S
2f1d0 6f 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  o, the call to s
2f1e0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2f1f0 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c  ).        ** cal
2f200 6c 73 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ls restoreCursor
2f210 50 6f 73 69 74 69 6f 6e 28 29 20 74 6f 20 70 6f  Position() to po
2f220 69 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20 74  int the cursor t
2f230 6f 20 74 68 65 20 63 6f 70 79 0a 20 20 20 20 20  o the copy.     
2f240 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 6f 6e 20     ** stored on 
2f250 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
2f260 65 2c 20 74 68 65 6e 20 61 64 76 61 6e 63 65 73  e, then advances
2f270 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
2f280 72 79 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ry,.        ** w
2f290 68 69 63 68 20 68 61 70 70 65 6e 73 20 74 6f 20  hich happens to 
2f2a0 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  be the copy of t
2f2b0 68 65 20 6b 65 79 20 6f 6e 20 74 68 65 20 69 6e  he key on the in
2f2c0 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 20 20 20  ternal node..   
2f2d0 20 20 20 20 20 2a 2a 20 4e 65 74 20 65 66 66 65       ** Net effe
2f2e0 63 74 3a 20 6c 65 61 66 43 75 72 20 69 73 20 70  ct: leafCur is p
2f2f0 6f 69 6e 74 69 6e 67 20 62 61 63 6b 20 74 6f 20  ointing back to 
2f300 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 65  the duplicate ce
2f310 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ll.        ** th
2f320 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  at needs to be r
2f330 65 6d 6f 76 65 64 2c 20 61 6e 64 20 74 68 65 20  emoved, and the 
2f340 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 5d  leafCur.apPage[]
2f350 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
2f360 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 20  leafCur.aiIdx[] 
2f370 61 72 72 61 79 73 20 61 72 65 20 63 6f 72 72 65  arrays are corre
2f380 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ct..        */. 
2f390 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28         VVA_ONLY(
2f3a0 20 50 67 6e 6f 20 6c 65 61 66 50 67 6e 6f 20 3d   Pgno leafPgno =
2f3b0 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f   pLeafPage->pgno
2f3c0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
2f3d0 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
2f3e0 69 6f 6e 28 26 6c 65 61 66 43 75 72 29 3b 0a 20  ion(&leafCur);. 
2f3f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2f400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f410 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f420 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61  e3BtreeNext(&lea
2f430 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b  fCur, &notUsed);
2f440 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f450 20 20 20 70 4c 65 61 66 50 61 67 65 20 3d 20 6c     pLeafPage = l
2f460 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 6c 65  eafCur.apPage[le
2f470 61 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20  afCur.iPage];.  
2f480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
2f490 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c  eafPage->pgno==l
2f4a0 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 20 20 20  eafPgno );.     
2f4b0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
2f4c0 75 72 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72  ur.aiIdx[leafCur
2f4d0 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20  .iPage]==0 );.  
2f4e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2f4f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f500 7b 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  {.        dropCe
2f510 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c 20 30 2c  ll(pLeafPage, 0,
2f520 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   szNext);.      
2f530 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6c 65 61 66    VVA_ONLY( leaf
2f540 43 75 72 2e 70 61 67 65 73 53 68 75 66 66 6c 65  Cur.pagesShuffle
2f550 64 20 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 20  d = 0 );.       
2f560 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 26 6c   rc = balance(&l
2f570 65 61 66 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  eafCur, 0);.    
2f580 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
2f590 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 7c 7c  CursorInvalid ||
2f5a0 20 21 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53   !leafCur.pagesS
2f5b0 68 75 66 66 6c 65 64 0a 20 20 20 20 20 20 20 20  huffled.        
2f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5d0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21 70             || !p
2f5e0 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
2f5f0 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
2f600 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
2f610 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43  treeReleaseTempC
2f620 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b  ursor(&leafCur);
2f630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52  .  }else{.    TR
2f640 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
2f650 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72  ble=%d delete fr
2f660 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20  om leaf %d\n",. 
2f670 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2f680 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2f690 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  o));.    dropCel
2f6a0 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 63 65  l(pPage, idx, ce
2f6b0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2f6c0 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63   pCell));.    rc
2f6d0 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c   = balance(pCur,
2f6e0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
2f6f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f700 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
2f710 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cur);.  }.  retu
2f720 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2f730 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72  Create a new BTr
2f740 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65  ee table.  Write
2f750 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74   into *piTable t
2f760 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
2f770 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  r for the root p
2f780 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
2f790 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
2f7a0 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20  type of type is 
2f7b0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
2f7c0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2f7d0 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20  r.  Only the.** 
2f7e0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73  following values
2f7f0 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75   of flags are cu
2f800 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20  rrently in use. 
2f810 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f   Other values fo
2f820 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74  r.** flags might
2f830 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a   not work:.**.**
2f840 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45       BTREE_INTKE
2f850 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41  Y|BTREE_LEAFDATA
2f860 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2f870 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f  L tables with ro
2f880 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20  wid keys.**     
2f890 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20  BTREE_ZERODATA  
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8b0 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64  Used for SQL ind
2f8c0 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ices.*/.static i
2f8d0 6e 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61  nt btreeCreateTa
2f8e0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2f8f0 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20  t *piTable, int 
2f900 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72  flags){.  BtShar
2f910 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2f920 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  ;.  MemPage *pRo
2f930 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  ot;.  Pgno pgnoR
2f940 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  oot;.  int rc;..
2f950 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f960 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2f970 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  (p) );.  if( pBt
2f980 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
2f990 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2f9a0 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
2f9b0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
2f9c0 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 63 20  first */.    rc 
2f9d0 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2f9e0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2f9f0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2fa00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2fa10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2fa20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2fa30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2fa40 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2fa50 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2fa60 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2fa70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
2fa80 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   1, 0);.  if( rc
2fa90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2faa0 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69  c;.  }.#else.  i
2fab0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2fac0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
2fad0 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a  gnoMove;      /*
2fae0 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72   Move a page her
2faf0 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  e to make room f
2fb00 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
2fb10 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
2fb20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54  *pPageMove; /* T
2fb30 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  he page to move 
2fb40 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  to. */..    /* C
2fb50 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  reating a new ta
2fb60 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79  ble may probably
2fb70 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
2fb80 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  an existing data
2fb90 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  base.    ** to m
2fba0 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2fbb0 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74   new tables root
2fbc0 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74   page. In case t
2fbd0 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20  his page turns. 
2fbe0 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20     ** out to be 
2fbf0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2fc00 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65  , delete all ove
2fc10 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63  rflow page-map c
2fc20 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c  aches.    ** hel
2fc30 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72  d by open cursor
2fc40 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  s..    */.    in
2fc50 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
2fc60 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a  lowCache(pBt);..
2fc70 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
2fc80 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d  value of meta[3]
2fc90 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2fca0 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  se to determine 
2fcb0 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  where the.    **
2fcc0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
2fcd0 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75  e new table shou
2fce0 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69  ld go. meta[3] i
2fcf0 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  s the largest ro
2fd00 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63  ot-page.    ** c
2fd10 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73  reated so far, s
2fd20 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  o the new root-p
2fd30 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b  age is (meta[3]+
2fd40 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  1)..    */.    r
2fd50 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2fd60 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70  GetMeta(p, 4, &p
2fd70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
2fd80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fd90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2fda0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 67  rc;.    }.    pg
2fdb0 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f  noRoot++;..    /
2fdc0 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  * The new root-p
2fdd0 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  age may not be a
2fde0 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f  llocated on a po
2fdf0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2fe00 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45  or the.    ** PE
2fe10 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e  NDING_BYTE page.
2fe20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
2fe30 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52  e( pgnoRoot==PTR
2fe40 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
2fe50 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20  pgnoRoot) ||.   
2fe60 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50       pgnoRoot==P
2fe70 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2fe80 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70  (pBt) ){.      p
2fe90 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d  gnoRoot++;.    }
2fea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2feb0 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20  oRoot>=3 );..   
2fec0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70   /* Allocate a p
2fed0 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68  age. The page th
2fee0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73  at currently res
2fef0 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ides at pgnoRoot
2ff00 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
2ff10 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c  moved to the all
2ff20 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c  ocated page (unl
2ff30 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  ess the allocate
2ff40 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20  d page happens. 
2ff50 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20     ** to reside 
2ff60 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20  at pgnoRoot)..  
2ff70 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c    */.    rc = al
2ff80 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2ff90 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c  pBt, &pPageMove,
2ffa0 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f   &pgnoMove, pgno
2ffb0 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66  Root, 1);.    if
2ffc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ffd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2ffe0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2fff0 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e  f( pgnoMove!=pgn
30000 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f  oRoot ){.      /
30010 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68  * pgnoRoot is th
30020 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  e page that will
30030 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
30040 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20   root-page of.  
30050 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74      ** the new t
30060 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61  able (assuming a
30070 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20  n error did not 
30080 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77  occur). But we w
30090 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  ere.      ** all
300a0 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e  ocated pgnoMove.
300b0 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e   If required (i.
300c0 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  e. if it was not
300d0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
300e0 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67   ** by extending
300f0 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20   the file), the 
30100 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20  current page at 
30110 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76  position pgnoMov
30120 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  e.      ** is al
30130 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e  ready journaled.
30140 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30150 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
30160 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
30170 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30180 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20  e(pPageMove);.. 
30190 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65       /* Move the
301a0 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
301b0 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70  at pgnoRoot to p
301c0 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  gnoMove. */.    
301d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
301e0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
301f0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
30200 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
30210 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30220 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
30230 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
30240 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
30250 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
30260 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
30270 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
30280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65  !=SQLITE_OK || e
30290 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
302a0 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d  TPAGE || eType==
302b0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
302c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
302d0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
302e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
302f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30300 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
30310 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
30320 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30330 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMAP_FR
30340 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  EEPAGE );.      
30350 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30360 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
30370 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
30380 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30390 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
303a0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
303b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
303c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
303d0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
303e0 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54  e(pBt, pRoot, eT
303f0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70  ype, iPtrPage, p
30400 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20  gnoMove, 0);.   
30410 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30420 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Root);..      /*
30430 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   Obtain the page
30440 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a   at pgnoRoot */.
30450 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30470 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30480 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
30490 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
304a0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f  Page(pBt, pgnoRo
304b0 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a  ot, &pRoot, 0);.
304c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
304d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
304e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
304f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
30500 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30510 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  te(pRoot->pDbPag
30520 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
30530 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30540 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
30550 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
30560 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30570 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
30580 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70  .      pRoot = p
30590 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20  PageMove;.    } 
305a0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
305b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
305c0 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69  and meta-data wi
305d0 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  th the new root-
305e0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  page number. */.
305f0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
30600 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ut(pBt, pgnoRoot
30610 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
30620 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
30630 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  c ){.      relea
30640 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
30650 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30660 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
30670 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
30680 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f  eMeta(p, 4, pgno
30690 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
306a0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  c ){.      relea
306b0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
306c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
306d0 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
306e0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
306f0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
30700 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
30710 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 1, 0);.    if
30720 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
30730 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61  ;.  }.#endif.  a
30740 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
30750 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
30760 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29  Root->pDbPage) )
30770 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f  ;.  zeroPage(pRo
30780 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f  ot, flags | PTF_
30790 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  LEAF);.  sqlite3
307a0 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74  PagerUnref(pRoot
307b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70  ->pDbPage);.  *p
307c0 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67  iTable = (int)pg
307d0 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e  noRoot;.  return
307e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
307f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  t sqlite3BtreeCr
30800 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20  eateTable(Btree 
30810 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65  *p, int *piTable
30820 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
30830 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
30840 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
30850 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70    p->pBt->db = p
30860 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72  ->db;.  rc = btr
30870 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c  eeCreateTable(p,
30880 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29   piTable, flags)
30890 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
308a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
308b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
308c0 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e 20  Erase the given 
308d0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61 6e  database page an
308e0 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72  d all its childr
308f0 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  en.  Return.** t
30900 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
30910 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  reelist..*/.stat
30920 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61  ic int clearData
30930 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53 68  basePage(.  BtSh
30940 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
30950 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
30960 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
30970 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50  the table */.  P
30980 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
30990 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
309a0 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a  ber to clear */.
309b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
309c0 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  nt,     /* Paren
309d0 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f  t page.  NULL fo
309e0 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20  r the root */.  
309f0 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67  int freePageFlag
30a00 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63  ,     /* Dealloc
30a10 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65  ate page if true
30a20 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61   */.  int *pnCha
30a30 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  nge.){.  MemPage
30a40 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
30a50 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
30a60 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20  d char *pCell;. 
30a70 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
30a80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
30a90 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
30aa0 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ) );.  if( pgno>
30ab0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
30ac0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
30ad0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30ae0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
30af0 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   }..  rc = getAn
30b00 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
30b10 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
30b20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
30b30 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
30b40 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
30b50 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
30b60 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
30b70 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
30b80 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
30b90 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
30ba0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
30bb0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
30bc0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
30bd0 20 70 50 61 67 65 2c 20 31 2c 20 70 6e 43 68 61   pPage, 1, pnCha
30be0 6e 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nge);.      if( 
30bf0 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
30c00 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
30c10 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
30c20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
30c30 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
30c40 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
30c50 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
30c60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
30c70 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
30c80 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
30c90 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
30ca0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
30cb0 74 61 5b 38 5d 29 2c 20 70 50 61 67 65 2c 20 31  ta[8]), pPage, 1
30cc0 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  , pnChange);.   
30cd0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
30ce0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
30cf0 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _out;.  }else if
30d00 28 20 70 6e 43 68 61 6e 67 65 20 29 7b 0a 20 20  ( pnChange ){.  
30d10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
30d20 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 2a  >intKey );.    *
30d30 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50 61 67  pnChange += pPag
30d40 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20  e->nCell;.  }.  
30d50 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67  if( freePageFlag
30d60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
30d70 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
30d80 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
30d90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30da0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
30db0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72  ))==0 ){.    zer
30dc0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  oPage(pPage, pPa
30dd0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50  ge->aData[0] | P
30de0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63  TF_LEAF);.  }..c
30df0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
30e00 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50  _out:.  releaseP
30e10 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
30e20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
30e30 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66  * Delete all inf
30e40 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
30e50 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
30e60 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69  the database.  i
30e70 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20  Table is.** the 
30e80 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
30e90 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
30ea0 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69  able.  After thi
30eb0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
30ec0 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s,.** the root p
30ed0 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75  age is empty, bu
30ee0 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a  t still exists..
30ef0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
30f00 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
30f10 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
30f20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
30f30 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75   open.** read cu
30f40 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
30f50 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20  le.  Open write 
30f60 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65  cursors are move
30f70 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  d to the.** root
30f80 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
30f90 2a 0a 2a 2a 20 49 66 20 70 6e 43 68 61 6e 67 65  *.** If pnChange
30fa0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
30fb0 65 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20  en table iTable 
30fc0 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 6b 65  must be an intke
30fd0 79 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20  y table. The.** 
30fe0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 70 6f  integer value po
30ff0 69 6e 74 65 64 20 74 6f 20 62 79 20 70 6e 43 68  inted to by pnCh
31000 61 6e 67 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  ange is incremen
31010 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
31020 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65 73 20  r of.** entries 
31030 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
31040 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
31050 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65  eClearTable(Btre
31060 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
31070 2c 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 29  , int *pnChange)
31080 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
31090 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
310a0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
310b0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
310c0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
310d0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
310e0 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
310f0 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  {.    rc = pBt->
31100 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
31110 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
31120 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
31130 73 65 20 69 66 28 20 28 72 63 20 3d 20 63 68 65  se if( (rc = che
31140 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69  ckReadLocks(p, i
31150 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53  Table, 0, 1))!=S
31160 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31170 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
31180 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
31190 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
311a0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
311b0 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
311c0 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
311d0 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
311e0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  lse{.    rc = cl
311f0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
31200 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
31210 65 2c 20 30 2c 20 30 2c 20 70 6e 43 68 61 6e 67  e, 0, 0, pnChang
31220 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
31230 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
31240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31250 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
31260 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61  information in a
31270 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74   table and add t
31280 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
31290 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66  able to.** the f
312a0 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74  reelist.  Except
312b0 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  , the root of th
312c0 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c  e principle tabl
312d0 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a  e (the one on.**
312e0 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65   page 1) is neve
312f0 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  r added to the f
31300 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  reelist..**.** T
31310 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
31320 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
31330 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
31340 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
31350 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  * cursors on the
31360 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
31370 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
31380 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70  nabled and the p
31390 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73  age at iTable is
313a0 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a   not the last.**
313b0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
313c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
313d0 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
313e0 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20  oot page .** in 
313f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31400 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  e is moved into 
31410 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  the slot formerl
31420 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a  y occupied by.**
31430 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74   iTable and that
31440 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65   last slot forme
31450 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  rly occupied by 
31460 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
31470 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ge.** is added t
31480 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  o the freelist i
31490 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65  nstead of iTable
314a0 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20  .  In this say, 
314b0 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
314c0 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68  s are kept at th
314d0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
314e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
314f0 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65  , which.** is ne
31500 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f  cessary for AUTO
31510 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72  VACUUM to work r
31520 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20  ight.  *piMoved 
31530 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
31540 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  * page number th
31550 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68  at used to be th
31560 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
31570 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66   in the file bef
31580 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e  ore.** the move.
31590 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74    If no page get
315a0 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65  s moved, *piMove
315b0 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
315c0 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  * The last root 
315d0 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64  page is recorded
315e0 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20   in meta[3] and 
315f0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
31600 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74  meta[3] is updat
31610 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
31620 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dure..*/.static 
31630 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62  int btreeDropTab
31640 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
31650 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
31660 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
31670 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
31680 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
31690 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
316a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
316b0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
316c0 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20  tex(p) );.  if( 
316d0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
316e0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
316f0 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
31700 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
31710 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
31720 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
31730 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
31740 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66   drop a table if
31750 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65   any cursors are
31760 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a   open on the.  *
31770 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
31780 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61   is because in a
31790 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
317a0 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a  the backend may.
317b0 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76    ** need to mov
317c0 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70  e another root-p
317d0 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61  age to fill a ga
317e0 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
317f0 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20  leted.  ** root 
31800 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e  page. If an open
31810 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e   cursor was usin
31820 67 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72  g this page a pr
31830 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a  oblem would .  *
31840 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20  * occur..  */.  
31850 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
31860 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
31870 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
31880 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
31890 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
318a0 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c  t, (Pgno)iTable,
318b0 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69   &pPage, 0);.  i
318c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
318d0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
318e0 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
318f0 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a  (p, iTable, 0);.
31900 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31910 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
31920 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
31930 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76  c;.  }..  *piMov
31940 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ed = 0;..  if( i
31950 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65  Table>1 ){.#ifde
31960 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31970 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20  TOVACUUM.    rc 
31980 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
31990 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
319a0 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65  ge(pPage);.#else
319b0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
319c0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
319d0 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67    Pgno maxRootPg
319e0 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
319f0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
31a00 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f  ta(p, 4, &maxRoo
31a10 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  tPgno);.      if
31a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31a30 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
31a40 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
31a50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
31a60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31a70 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78   if( iTable==max
31a80 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20  RootPgno ){.    
31a90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61      /* If the ta
31aa0 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
31ab0 64 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77  d is the table w
31ac0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
31ad0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
31ae0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
31af0 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74  he database, put
31b00 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
31b10 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  n the free list.
31b20 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
31b30 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
31b40 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
31b50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
31b60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
31b70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
31b90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
31ba0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
31bb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
31bc0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
31bd0 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ed does not have
31be0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
31bf0 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
31c00 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
31c10 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76  database. So mov
31c20 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  e the page that 
31c30 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20  does into the . 
31c40 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65         ** gap le
31c50 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65  ft by the delete
31c60 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20  d root-page..   
31c70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31c80 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a  MemPage *pMove;.
31c90 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
31ca0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
31cb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31cc0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
31cd0 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26  , maxRootPgno, &
31ce0 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  pMove, 0);.     
31cf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31d00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
31d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
31d30 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
31d40 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52  (pBt, pMove, PTR
31d50 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c  MAP_ROOTPAGE, 0,
31d60 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20   iTable, 0);.   
31d70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
31d80 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
31d90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31da0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31db0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
31dc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
31dd0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
31de0 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f  tPage(pBt, maxRo
31df0 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20  otPgno, &pMove, 
31e00 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
31e10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31e20 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
31e30 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
31e40 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
31e50 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
31e60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
31e70 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
31e80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31e90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
31ea0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
31ec0 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74  iMoved = maxRoot
31ed0 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Pgno;.      }.. 
31ee0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
31ef0 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61  new 'max-root-pa
31f00 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65  ge' value in the
31f10 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
31f20 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
31f30 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  is the old value
31f40 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20   less one, less 
31f50 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74  one more if that
31f60 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20   happens to.    
31f70 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70    ** be a root-p
31f80 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73  age number, less
31f90 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68   one again if th
31fa0 61 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  at is the.      
31fb0 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ** PENDING_BYTE_
31fc0 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  PAGE..      */. 
31fd0 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
31fe0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61  --;.      if( ma
31ff0 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49  xRootPgno==PENDI
32000 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
32010 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78  ) ){.        max
32020 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
32030 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61    }.      if( ma
32040 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41  xRootPgno==PTRMA
32050 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61  P_PAGENO(pBt, ma
32060 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20  xRootPgno) ){.  
32070 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
32080 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
32090 20 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f     assert( maxRo
320a0 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  otPgno!=PENDING_
320b0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
320c0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
320d0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
320e0 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f  Meta(p, 4, maxRo
320f0 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c  otPgno);.    }el
32100 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
32110 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
32120 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32130 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
32140 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
32150 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65      /* If sqlite
32160 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20  3BtreeDropTable 
32170 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61  was called on pa
32180 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72  ge 1. */.    zer
32190 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50 54 46  oPage(pPage, PTF
321a0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
321b0 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   );.    releaseP
321c0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
321d0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
321e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
321f0 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
32200 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
32210 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a   int *piMoved){.
32220 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
32230 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
32240 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d  ;.  p->pBt->db =
32250 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62   p->db;.  rc = b
32260 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c  treeDropTable(p,
32270 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64   iTable, piMoved
32280 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
32290 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
322a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
322b0 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d  * Read the meta-
322c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
322d0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
322e0 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  le.  Meta[0].** 
322f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
32300 20 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72   free pages curr
32310 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74  ently in the dat
32320 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a  abase.  Meta[1].
32330 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b  ** through meta[
32340 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c  15] are availabl
32350 65 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67  e for use by hig
32360 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74  her layers.  Met
32370 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d  a[0].** is read-
32380 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73  only, the others
32390 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
323a0 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65  .** .** The sche
323b0 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73  ma layer numbers
323c0 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66   meta values dif
323d0 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68  ferently.  At th
323e0 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65  e schema.** laye
323f0 72 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f  r (and the SetCo
32400 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f  okie and ReadCoo
32410 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65  kie opcodes) the
32420 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72   number of.** fr
32430 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20  ee pages is not 
32440 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f  visible.  So Coo
32450 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61  kie[0] is the sa
32460 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a  me as Meta[1]..*
32470 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
32480 65 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20  eeGetMeta(Btree 
32490 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32  *p, int idx, u32
324a0 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61   *pMeta){.  DbPa
324b0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69  ge *pDbPage;.  i
324c0 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
324d0 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42  d char *pP1;.  B
324e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
324f0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
32500 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
32510 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
32520 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67  b;..  /* Reading
32530 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c   a meta-data val
32540 75 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65  ue requires a re
32550 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
32560 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a  1 (and hence.  *
32570 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
32580 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72  ter table. We gr
32590 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67  ab this lock reg
325a0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
325b0 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74  er or.  ** not t
325c0 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  he SQLITE_ReadUn
325d0 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
325e0 73 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65  s set (the table
325f0 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a   rooted at page.
32600 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65    ** 1 is treate
32610 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  d as a special c
32620 61 73 65 20 62 79 20 71 75 65 72 79 54 61 62 6c  ase by queryTabl
32630 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b  eLock() and lock
32640 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20  Table())..  */. 
32650 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65   rc = queryTable
32660 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f  Lock(p, 1, READ_
32670 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
32680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32690 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
326a0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
326b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
326c0 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
326d0 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28  idx<=15 );.  if(
326e0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a   pBt->pPage1 ){.
326f0 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74 72 65      /* The b-tre
32700 65 20 69 73 20 61 6c 72 65 61 64 79 20 68 6f 6c  e is already hol
32710 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
32720 20 74 6f 20 70 61 67 65 20 31 20 6f 66 20 74 68   to page 1 of th
32730 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
32740 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20  * file. In this 
32750 63 61 73 65 20 74 68 65 20 72 65 71 75 69 72 65  case the require
32760 64 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75  d meta-data valu
32770 65 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  e can be read di
32780 72 65 63 74 6c 79 0a 20 20 20 20 2a 2a 20 66 72  rectly.    ** fr
32790 6f 6d 20 74 68 65 20 70 61 67 65 20 64 61 74 61  om the page data
327a0 20 6f 66 20 74 68 69 73 20 72 65 66 65 72 65 6e   of this referen
327b0 63 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67  ce. This is slig
327c0 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e  htly faster than
327d0 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74 69  .    ** requesti
327e0 6e 67 20 61 20 6e 65 77 20 72 65 66 65 72 65 6e  ng a new referen
327f0 63 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ce from the page
32800 72 20 6c 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a  r layer..    */.
32810 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67      pP1 = (unsig
32820 6e 65 64 20 63 68 61 72 20 2a 29 70 42 74 2d 3e  ned char *)pBt->
32830 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
32840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
32850 68 65 20 62 2d 74 72 65 65 20 64 6f 65 73 20 6e  he b-tree does n
32860 6f 74 20 68 61 76 65 20 61 20 72 65 66 65 72 65  ot have a refere
32870 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 6f 66  nce to page 1 of
32880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32890 6c 65 2e 0a 20 20 20 20 2a 2a 20 4f 62 74 61 69  le..    ** Obtai
328a0 6e 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 70  n one from the p
328b0 61 67 65 72 20 6c 61 79 65 72 2e 0a 20 20 20 20  ager layer..    
328c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
328d0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
328e0 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62  >pPager, 1, &pDb
328f0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
32900 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
32910 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
32920 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
32930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 31 20  ;.    }.    pP1 
32940 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
32950 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
32960 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
32970 0a 20 20 7d 0a 20 20 2a 70 4d 65 74 61 20 3d 20  .  }.  *pMeta = 
32980 67 65 74 34 62 79 74 65 28 26 70 50 31 5b 33 36  get4byte(&pP1[36
32990 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 0a 20 20 2f   + idx*4]);..  /
329a0 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  * If the b-tree 
329b0 69 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61  is not holding a
329c0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
329d0 67 65 20 31 2c 20 74 68 65 6e 20 6f 6e 65 20 77  ge 1, then one w
329e0 61 73 20 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  as .  ** request
329f0 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
32a00 72 20 6c 61 79 65 72 20 69 6e 20 74 68 65 20 61  r layer in the a
32a10 62 6f 76 65 20 62 6c 6f 63 6b 2e 20 52 65 6c 65  bove block. Rele
32a20 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
32a30 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 50 61  .  if( !pBt->pPa
32a40 67 65 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ge1 ){.    sqlit
32a50 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
32a60 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
32a70 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64   If autovacuumed
32a80 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
32a90 74 68 69 73 20 62 75 69 6c 64 20 62 75 74 20 77  this build but w
32aa0 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
32ab0 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20  .  ** access an 
32ac0 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74  autovacuumed dat
32ad0 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65  abase, then make
32ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
32af0 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69  adonly. .  */.#i
32b00 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
32b10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
32b20 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65  ( idx==4 && *pMe
32b30 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64  ta>0 ) pBt->read
32b40 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66  Only = 1;.#endif
32b50 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20  ..  /* Grab the 
32b60 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
32b70 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c  e 1. */.  rc = l
32b80 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52  ockTable(p, 1, R
32b90 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c  EAD_LOCK);.  sql
32ba0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
32bb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
32bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d  }../*.** Write m
32bd0 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
32be0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
32bf0 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d  tabase.  Meta[0]
32c00 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79   is.** read-only
32c10 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20   and may not be 
32c20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  written..*/.int 
32c30 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
32c40 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  teMeta(Btree *p,
32c50 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d   int idx, u32 iM
32c60 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64  eta){.  BtShared
32c70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
32c80 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32c90 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pP1;.  int rc;.
32ca0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31    assert( idx>=1
32cb0 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
32cc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
32cd0 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
32ce0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
32cf0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
32d00 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
32d10 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
32d20 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
32d30 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
32d40 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
32d50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
32d60 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70  age1!=0 );.    p
32d70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
32d80 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
32d90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32da0 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
32db0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
32dc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32dd0 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
32de0 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
32df0 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66  *4], iMeta);.#if
32e00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32e10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
32e20 20 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a    if( idx==7 ){.
32e30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32e40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
32e50 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20  || iMeta==0 );. 
32e60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
32e70 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61  Meta==0 || iMeta
32e80 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
32e90 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
32ea0 20 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a   iMeta;.      }.
32eb0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
32ec0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
32ed0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
32ee0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
32ef0 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62  eturn the flag b
32f00 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e  yte at the begin
32f10 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65  ning of the page
32f20 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
32f30 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
32f40 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
32f50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
32f60 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  eFlags(BtCursor 
32f70 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
32f80 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55  O: What about CU
32f90 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
32fa0 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79   state? Probably
32fb0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20   need to call.  
32fc0 2a 2a 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ** restoreCursor
32fd0 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e  Position() here.
32fe0 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  .  */.  MemPage 
32ff0 2a 70 50 61 67 65 3b 0a 20 20 72 65 73 74 6f 72  *pPage;.  restor
33000 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
33010 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d  pCur);.  pPage =
33020 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
33030 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
33040 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
33050 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
33060 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
33070 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74 20  >pBt==pCur->pBt 
33080 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
33090 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e ? pPage->aData
330a0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
330b0 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  t] : 0;.}.../*.*
330c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
330d0 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
330e0 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68 69  th a BTree.  Thi
330f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
33100 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
33110 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
33120 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73  nly..*/.Pager *s
33130 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
33140 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
33150 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61  turn p->pBt->pPa
33160 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ger;.}..#ifndef 
33170 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
33180 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
33190 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61  * Append a messa
331a0 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ge to the error 
331b0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
331c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
331d0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20  heckAppendMsg(. 
331e0 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
331f0 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d  heck,.  char *zM
33200 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sg1,.  const cha
33210 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e  r *zFormat,.  ..
33220 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
33230 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b  p;.  if( !pCheck
33240 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e  ->mxErr ) return
33250 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72  ;.  pCheck->mxEr
33260 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e  r--;.  pCheck->n
33270 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72  Err++;.  va_star
33280 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
33290 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72    if( pCheck->er
332a0 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20 20  rMsg.nChar ){.  
332b0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
332c0 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d  mAppend(&pCheck-
332d0 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20 31  >errMsg, "\n", 1
332e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 73  );.  }.  if( zMs
332f0 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g1 ){.    sqlite
33300 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
33310 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
33320 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20 7d   zMsg1, -1);.  }
33330 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e  .  sqlite3VXPrin
33340 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d  tf(&pCheck->errM
33350 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c 20  sg, 1, zFormat, 
33360 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
33370 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d  );.  if( pCheck-
33380 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46 61  >errMsg.mallocFa
33390 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 43 68 65  iled ){.    pChe
333a0 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ck->mallocFailed
333b0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 1;.  }.}.#end
333c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
333d0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
333e0 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
333f0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
33400 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
33410 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65 66  Add 1 to the ref
33420 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
33430 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66   page iPage.  If
33440 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
33450 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ond.** reference
33460 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64   to the page, ad
33470 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
33480 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45  ge to pCheck->zE
33490 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e  rrMsg..** Return
334a0 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20   1 if there are 
334b0 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72  2 ore more refer
334c0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
334d0 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66  e and 0 if.** if
334e0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
334f0 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  st reference to 
33500 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
33510 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20  Also check that 
33520 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
33530 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f  is in bounds..*/
33540 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
33550 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b  kRef(IntegrityCk
33560 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50   *pCheck, int iP
33570 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74  age, char *zCont
33580 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67  ext){.  if( iPag
33590 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  e==0 ) return 1;
335a0 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43 68  .  if( iPage>pCh
335b0 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50  eck->nPage || iP
335c0 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65  age<0 ){.    che
335d0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
335e0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69  ck, zContext, "i
335f0 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
33600 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  er %d", iPage);.
33610 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
33620 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  }.  if( pCheck->
33630 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20  anRef[iPage]==1 
33640 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
33650 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
33660 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66  ontext, "2nd ref
33670 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25  erence to page %
33680 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
33690 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
336a0 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d  return  (pCheck-
336b0 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29  >anRef[iPage]++)
336c0 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  >1;.}..#ifndef S
336d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
336e0 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ACUUM./*.** Chec
336f0 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79  k that the entry
33700 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
33710 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43 68  map for page iCh
33720 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20  ild maps to .** 
33730 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f  page iParent, po
33740 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54 79  inter type ptrTy
33750 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65  pe. If not, appe
33760 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
33770 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b  age.** to pCheck
33780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
33790 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20   checkPtrmap(.  
337a0 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
337b0 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72  eck,   /* Integr
337c0 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78  ity check contex
337d0 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  t */.  Pgno iChi
337e0 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ld,           /*
337f0 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62   Child page numb
33800 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  er */.  u8 eType
33810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
33820 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
33830 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20  er map type */. 
33840 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20   Pgno iParent,  
33850 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
33860 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
33870 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
33880 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  er */.  char *zC
33890 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 2f  ontext         /
338a0 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69  * Context descri
338b0 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20  ption (used for 
338c0 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b  error msg) */.){
338d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20  .  int rc;.  u8 
338e0 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50  ePtrmapType;.  P
338f0 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e  gno iPtrmapParen
33900 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61  t;..  rc = ptrma
33910 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74  pGet(pCheck->pBt
33920 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d  , iChild, &ePtrm
33930 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70  apType, &iPtrmap
33940 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
33950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33960 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
33970 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
33980 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20  ext, "Failed to 
33990 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d  read ptrmap key=
339a0 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  %d", iChild);.  
339b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
339c0 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70 65   if( ePtrmapType
339d0 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d  !=eType || iPtrm
339e0 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e  apParent!=iParen
339f0 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  t ){.    checkAp
33a00 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
33a10 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
33a20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e   "Bad ptr map en
33a30 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63  try key=%d expec
33a40 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d  ted=(%d,%d) got=
33a50 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20  (%d,%d)", .     
33a60 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20   iChild, eType, 
33a70 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70  iParent, ePtrmap
33a80 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72  Type, iPtrmapPar
33a90 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ent);.  }.}.#end
33aa0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
33ab0 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
33ac0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72   the freelist or
33ad0 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
33ae0 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65  page list..** Ve
33af0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
33b00 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
33b10 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a   the list is N..
33b20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
33b30 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65  heckList(.  Inte
33b40 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
33b50 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63    /* Integrity c
33b60 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  hecking context 
33b70 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c  */.  int isFreeL
33b80 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72  ist,       /* Tr
33b90 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73  ue for a freelis
33ba0 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76  t.  False for ov
33bb0 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
33bc0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
33bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
33be0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66  age number for f
33bf0 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  irst page in the
33c00 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e   list */.  int N
33c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33c20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d   /* Expected num
33c30 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
33c40 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68  the list */.  ch
33c50 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
33c60 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66      /* Context f
33c70 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
33c80 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
33c90 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64 20  .  int expected 
33ca0 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73  = N;.  int iFirs
33cb0 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69  t = iPage;.  whi
33cc0 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70  le( N-- > 0 && p
33cd0 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a  Check->mxErr ){.
33ce0 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66      DbPage *pOvf
33cf0 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67  lPage;.    unsig
33d00 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44  ned char *pOvflD
33d10 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61  ata;.    if( iPa
33d20 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68  ge<1 ){.      ch
33d30 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
33d40 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
33d50 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20 25          "%d of %
33d60 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20  d pages missing 
33d70 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69  from overflow li
33d80 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 25  st starting at %
33d90 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b  d",.          N+
33da0 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46 69  1, expected, iFi
33db0 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rst);.      brea
33dc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
33dd0 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
33de0 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
33df0 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  t) ) break;.    
33e00 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
33e10 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67  Get(pCheck->pPag
33e20 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  er, (Pgno)iPage,
33e30 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a   &pOvflPage) ){.
33e40 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
33e50 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
33e60 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74  ntext, "failed t
33e70 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c 20  o get page %d", 
33e80 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72  iPage);.      br
33e90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
33ea0 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69  OvflData = (unsi
33eb0 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
33ec0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
33ed0 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20  pOvflPage);.    
33ee0 69 66 28 20 69 73 46 72 65 65 4c 69 73 74 20 29  if( isFreeList )
33ef0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
33f00 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
33f10 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66  ata[4]);.#ifndef
33f20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33f30 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
33f40 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
33f50 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
33f60 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
33f70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
33f80 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
33f90 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
33fa0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
33fb0 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b      if( n>pCheck
33fc0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
33fd0 65 2f 34 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  e/4-2 ){.       
33fe0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
33ff0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
34000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66 72  ,.           "fr
34010 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e  eelist leaf coun
34020 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67  t too big on pag
34030 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
34040 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20         N--;.    
34050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34060 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
34070 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ++){.          P
34080 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20  gno iFreePage = 
34090 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
340a0 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66  ata[8+i*4]);.#if
340b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
340c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
340d0 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
340e0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
340f0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  m ){.           
34100 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
34110 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
34120 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
34130 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
34140 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
34150 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  f.          chec
34160 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72  kRef(pCheck, iFr
34170 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74  eePage, zContext
34180 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34190 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20       N -= n;.   
341a0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
341b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
341c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c  UTOVACUUM.    el
341d0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
341e0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 75  this database su
341f0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
34200 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73 20  um and iPage is 
34210 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20  not the last.   
34220 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
34230 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  is overflow list
34240 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
34250 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
34260 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ry for.      ** 
34270 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  the following pa
34280 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67 65  ge matches iPage
34290 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
342a0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
342b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
342c0 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  N>0 ){.        i
342d0 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66   = get4byte(pOvf
342e0 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  lData);.        
342f0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
34300 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56  ck, i, PTRMAP_OV
34310 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20  ERFLOW2, iPage, 
34320 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
34330 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
34340 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
34350 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b  byte(pOvflData);
34360 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
34370 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65  rUnref(pOvflPage
34380 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
34390 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
343a0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
343b0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
343c0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
343d0 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20  _CHECK./*.** Do 
343e0 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63  various sanity c
343f0 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c  hecks on a singl
34400 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65 65  e page of a tree
34410 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
34420 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f   tree depth.  Ro
34430 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e 20  ot pages return 
34440 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72  0.  Parents of r
34450 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74  oot pages.** ret
34460 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f  urn 1, and so fo
34470 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73  rth..** .** Thes
34480 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e  e checks are don
34490 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e  e:.**.**      1.
344a0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74    Make sure that
344b0 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62   cells and freeb
344c0 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65  locks do not ove
344d0 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20  rlap.**         
344e0 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20   but combine to 
344f0 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72  completely cover
34500 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e   the page..**  N
34510 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  2.  Make sure
34520 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69   cell keys are i
34530 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20  n order..**  NO 
34540 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e   3.  Make sure n
34550 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68  o key is less th
34560 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
34570 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20  LowerBound..**  
34580 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72  NO  4.  Make sur
34590 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61  e no key is grea
345a0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
345b0 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64  l to zUpperBound
345c0 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68  ..**      5.  Ch
345d0 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
345e0 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  y of overflow pa
345f0 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20  ges..**      6. 
34600 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c   Recursively cal
34610 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 20  l checkTreePage 
34620 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e  on all children.
34630 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72  .**      7.  Ver
34640 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65 70  ify that the dep
34650 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  th of all childr
34660 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a  en is the same..
34670 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65  **      8.  Make
34680 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65 20   sure this page 
34690 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25 20  is at least 33% 
346a0 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20  full or else it 
346b0 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  is.**          t
346c0 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
346d0 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
346e0 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  nt checkTreePage
346f0 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
34700 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e  *pCheck,  /* Con
34710 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e  text for the san
34720 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69  ity check */.  i
34730 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20  nt iPage,       
34740 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
34750 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
34760 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65  to check */.  Me
34770 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
34780 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
34790 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ge */.  char *zP
347a0 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a  arentContext  /*
347b0 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20   Parent context 
347c0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
347d0 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c  *pPage;.  int i,
347e0 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20   rc, depth, d2, 
347f0 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74  pgno, cnt;.  int
34800 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b   hdr, cellStart;
34810 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
34820 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68  u8 *data;.  BtSh
34830 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74  ared *pBt;.  int
34840 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63   usableSize;.  c
34850 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30  har zContext[100
34860 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 20 3d  ];.  char *hit =
34870 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73   0;..  sqlite3_s
34880 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
34890 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
348a0 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20 22 2c  xt, "Page %d: ",
348b0 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43   iPage);..  /* C
348c0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
348d0 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20  ge exists.  */. 
348e0 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70   pBt = pCheck->p
348f0 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  Bt;.  usableSize
34900 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
34910 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  ze;.  if( iPage=
34920 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
34930 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43   if( checkRef(pC
34940 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61  heck, iPage, zPa
34950 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29 20 72  rentContext) ) r
34960 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
34970 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
34980 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50  eGetPage(pBt, (P
34990 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67  gno)iPage, &pPag
349a0 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20  e, 0))!=0 ){.   
349b0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
349c0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
349d0 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  ,.       "unable
349e0 20 74 6f 20 67 65 74 20 74 68 65 20 70 61 67 65   to get the page
349f0 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22  . error code=%d"
34a00 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72  , rc);.    retur
34a10 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 0;.  }.  if( (
34a20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
34a30 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
34a40 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63  )!=0 ){.    chec
34a50 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
34a60 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20  k, zContext, .  
34a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a80 20 22 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e   "sqlite3BtreeIn
34a90 69 74 50 61 67 65 28 29 20 72 65 74 75 72 6e 73  itPage() returns
34aa0 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c   error code %d",
34ab0 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61 73   rc);.    releas
34ac0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
34ad0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
34ae0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20  .  /* Check out 
34af0 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20  all the cells.. 
34b00 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30 3b   */.  depth = 0;
34b10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
34b20 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43  age->nCell && pC
34b30 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b  heck->mxErr; i++
34b40 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
34b50 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20  ;.    int sz;.  
34b60 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
34b70 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70  ..    /* Check p
34b80 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20  ayload overflow 
34b90 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20  pages.    */.   
34ba0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
34bb0 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78  f(sizeof(zContex
34bc0 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  t), zContext,.  
34bd0 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 74             "On t
34be0 72 65 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c  ree page %d cell
34bf0 20 25 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69   %d: ", iPage, i
34c00 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  );.    pCell = f
34c10 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29  indCell(pPage,i)
34c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
34c30 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
34c40 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
34c50 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e  fo);.    sz = in
34c60 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66  fo.nData;.    if
34c70 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  ( !pPage->intKey
34c80 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b   ) sz += info.nK
34c90 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ey;.    assert( 
34ca0 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  sz==info.nPayloa
34cb0 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e  d );.    if( sz>
34cc0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
34cd0 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
34ce0 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63   (sz - info.nLoc
34cf0 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20  al + usableSize 
34d00 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65  - 5)/(usableSize
34d10 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e   - 4);.      Pgn
34d20 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74  o pgnoOvfl = get
34d30 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
34d40 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23  o.iOverflow]);.#
34d50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34d60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
34d70 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
34d80 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
34d90 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
34da0 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c  Check, pgnoOvfl,
34db0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
34dc0 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  1, iPage, zConte
34dd0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
34de0 64 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c  dif.      checkL
34df0 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70  ist(pCheck, 0, p
34e00 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20  gnoOvfl, nPage, 
34e10 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  zContext);.    }
34e20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73  ..    /* Check s
34e30 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68  anity of left ch
34e40 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ild page..    */
34e50 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
34e60 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
34e70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
34e80 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
34e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
34ea0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
34eb0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
34ec0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
34ed0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
34ee0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
34ef0 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  E, iPage, zConte
34f00 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
34f10 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63  dif.      d2 = c
34f20 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68  heckTreePage(pCh
34f30 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a  eck,pgno,pPage,z
34f40 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
34f50 69 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64  if( i>0 && d2!=d
34f60 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  epth ){.        
34f70 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
34f80 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
34f90 20 22 43 68 69 6c 64 20 70 61 67 65 20 64 65 70   "Child page dep
34fa0 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20  th differs");.  
34fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74      }.      dept
34fc0 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20  h = d2;.    }.  
34fd0 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
34fe0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
34ff0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
35000 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
35010 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
35020 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
35030 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e  intf(sizeof(zCon
35040 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c  text), zContext,
35050 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
35060 20 20 20 20 20 20 20 22 4f 6e 20 70 61 67 65 20         "On page 
35070 25 64 20 61 74 20 72 69 67 68 74 20 63 68 69 6c  %d at right chil
35080 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69  d: ", iPage);.#i
35090 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
350a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
350b0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
350c0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68  cuum ){.      ch
350d0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
350e0 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
350f0 54 52 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b  TREE, iPage, 0);
35100 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
35110 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28    checkTreePage(
35120 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50  pCheck, pgno, pP
35130 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
35140 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b    }. .  /* Check
35150 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f   for complete co
35160 76 65 72 61 67 65 20 6f 66 20 74 68 65 20 70 61  verage of the pa
35170 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d  ge.  */.  data =
35180 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
35190 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
351a0 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d  rOffset;.  hit =
351b0 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
351c0 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
351d0 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74 3d 3d  e );.  if( hit==
351e0 30 20 29 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d  0 ){.    pCheck-
351f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
35200 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
35210 75 31 36 20 63 6f 6e 74 65 6e 74 4f 66 66 73 65  u16 contentOffse
35220 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
35230 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
35240 69 66 20 28 63 6f 6e 74 65 6e 74 4f 66 66 73 65  if (contentOffse
35250 74 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 29 20  t > usableSize) 
35260 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
35270 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
35280 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
35290 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
352a0 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
352b0 68 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 25  header on page %
352c0 64 22 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20  d",iPage,0);.   
352d0 20 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 70 61     goto check_pa
352e0 67 65 5f 61 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  ge_abort;.    }.
352f0 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2b 63      memset(hit+c
35300 6f 6e 74 65 6e 74 4f 66 66 73 65 74 2c 20 30 2c  ontentOffset, 0,
35310 20 75 73 61 62 6c 65 53 69 7a 65 2d 63 6f 6e 74   usableSize-cont
35320 65 6e 74 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  entOffset);.    
35330 6d 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 63  memset(hit, 1, c
35340 6f 6e 74 65 6e 74 4f 66 66 73 65 74 29 3b 0a 20  ontentOffset);. 
35350 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62     nCell = get2b
35360 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
35370 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74  );.    cellStart
35380 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
35390 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
353a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
353b0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
353c0 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
353d0 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74  (&data[cellStart
353e0 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75 31  +i*2]);.      u1
353f0 36 20 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  6 size = 1024;. 
35400 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
35410 20 20 69 66 28 20 70 63 3c 3d 75 73 61 62 6c 65    if( pc<=usable
35420 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
35430 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
35440 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
35450 70 63 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pc]);.      }.  
35460 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65      if( (pc+size
35470 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  -1)>=usableSize 
35480 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20  || pc<0 ){.     
35490 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
354a0 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  g(pCheck, 0, .  
354b0 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75            "Corru
354c0 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69  ption detected i
354d0 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67  n cell %d on pag
354e0 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29  e %d",i,iPage,0)
354f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35500 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b         for(j=pc+
35510 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a  size-1; j>=pc; j
35520 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20  --) hit[j]++;.  
35530 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
35540 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74  for(cnt=0, i=get
35550 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
35560 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73  1]); i>0 && i<us
35570 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c  ableSize && cnt<
35580 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20  10000; .        
35590 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20     cnt++){.     
355a0 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32   int size = get2
355b0 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29  byte(&data[i+2])
355c0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
355d0 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65       if( (i+size
355e0 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  -1)>=usableSize 
355f0 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  || i<0 ){.      
35600 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
35610 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20  (pCheck, 0,  .  
35620 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75            "Corru
35630 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69  ption detected i
35640 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67  n cell %d on pag
35650 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29  e %d",i,iPage,0)
35660 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35670 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73         for(j=i+s
35680 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d  ize-1; j>=i; j--
35690 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
356a0 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65    }.      i = ge
356b0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29  t2byte(&data[i])
356c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
356d0 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c  i=cnt=0; i<usabl
356e0 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
356f0 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30     if( hit[i]==0
35700 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b   ){.        cnt+
35710 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
35720 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20  f( hit[i]>1 ){. 
35730 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
35740 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
35750 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74  .          "Mult
35760 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79  iple uses for by
35770 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25 64  te %d of page %d
35780 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20  ", i, iPage);.  
35790 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
357a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
357b0 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72  f( cnt!=data[hdr
357c0 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65  +7] ){.      che
357d0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
357e0 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ck, 0, .        
357f0 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70    "Fragmented sp
35800 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20 72  ace is %d byte r
35810 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e  eported as %d on
35820 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20   page %d",.     
35830 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68       cnt, data[h
35840 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20  dr+7], iPage);. 
35850 20 20 20 7d 0a 20 20 7d 0a 63 68 65 63 6b 5f 70     }.  }.check_p
35860 61 67 65 5f 61 62 6f 72 74 3a 0a 20 20 69 66 20  age_abort:.  if 
35870 28 68 69 74 29 20 73 71 6c 69 74 65 33 50 61 67  (hit) sqlite3Pag
35880 65 46 72 65 65 28 68 69 74 29 3b 0a 0a 20 20 72  eFree(hit);..  r
35890 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
358a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65 70 74  );.  return dept
358b0 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  h+1;.}.#endif /*
358c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
358d0 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
358e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
358f0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
35900 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  HECK./*.** This 
35910 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
35920 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f 66  omplete check of
35930 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65 65   the given BTree
35940 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20   file.  aRoot[] 
35950 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f  is.** an array o
35960 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20  f pages numbers 
35970 77 65 72 65 20 65 61 63 68 20 70 61 67 65 20 6e  were each page n
35980 75 6d 62 65 72 20 69 73 20 74 68 65 20 72 6f 6f  umber is the roo
35990 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74  t page of.** a t
359a0 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20  able.  nRoot is 
359b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
359c0 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a  tries in aRoot..
359d0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
359e0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 20  number of error 
359f0 73 65 65 6e 20 69 6e 20 2a 70 6e 45 72 72 2e 20  seen in *pnErr. 
35a00 20 45 78 63 65 70 74 20 66 6f 72 20 73 6f 6d 65   Except for some
35a10 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63   memory.** alloc
35a20 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c 20 20 6e  ation errors,  n
35a30 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
35a40 69 73 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  is held in memor
35a50 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
35a60 2a 2a 20 6d 61 6c 6c 6f 63 20 69 73 20 72 65 74  ** malloc is ret
35a70 75 72 6e 65 64 20 69 66 20 2a 70 6e 45 72 72 20  urned if *pnErr 
35a80 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66  is non-zero.  If
35a90 20 2a 70 6e 45 72 72 3d 3d 30 20 74 68 65 6e 20   *pnErr==0 then 
35aa0 4e 55 4c 4c 20 69 73 0a 2a 2a 20 72 65 74 75 72  NULL is.** retur
35ab0 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ned..*/.char *sq
35ac0 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72  lite3BtreeIntegr
35ad0 69 74 79 43 68 65 63 6b 28 0a 20 20 42 74 72 65  ityCheck(.  Btre
35ae0 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68 65  e *p,     /* The
35af0 20 62 74 72 65 65 20 74 6f 20 62 65 20 63 68 65   btree to be che
35b00 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  cked */.  int *a
35b10 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61 72  Root,   /* An ar
35b20 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  ray of root page
35b30 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 69 6e  s numbers for in
35b40 64 69 76 69 64 75 61 6c 20 74 72 65 65 73 20 2a  dividual trees *
35b50 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20  /.  int nRoot,  
35b60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
35b70 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b  ntries in aRoot[
35b80 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72  ] */.  int mxErr
35b90 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20 72 65 70  ,    /* Stop rep
35ba0 6f 72 74 69 6e 67 20 65 72 72 6f 72 73 20 61 66  orting errors af
35bb0 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20 2a 2f  ter this many */
35bc0 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72 20 20 20  .  int *pnErr   
35bd0 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72   /* Write number
35be0 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20   of errors seen 
35bf0 74 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  to this variable
35c00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
35c10 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e    int nRef;.  In
35c20 74 65 67 72 69 74 79 43 6b 20 73 43 68 65 63 6b  tegrityCk sCheck
35c30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
35c40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 63 68  t = p->pBt;.  ch
35c50 61 72 20 7a 45 72 72 5b 31 30 30 5d 3b 0a 0a 20  ar zErr[100];.. 
35c60 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
35c70 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
35c80 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 6e 52 65 66   = p->db;.  nRef
35c90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
35ca0 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
35cb0 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b  ger);.  if( lock
35cc0 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
35cd0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
35ce0 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a      *pnErr = 1;.
35cf0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
35d00 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
35d10 74 75 72 6e 20 73 71 6c 69 74 65 33 44 62 53 74  turn sqlite3DbSt
35d20 72 44 75 70 28 30 2c 20 22 63 61 6e 6e 6f 74 20  rDup(0, "cannot 
35d30 61 63 71 75 69 72 65 20 61 20 72 65 61 64 20 6c  acquire a read l
35d40 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
35d50 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68  ase");.  }.  sCh
35d60 65 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20  eck.pBt = pBt;. 
35d70 20 73 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d   sCheck.pPager =
35d80 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
35d90 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70  sCheck.nPage = p
35da0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 73 43  agerPagecount(sC
35db0 68 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a 20 20  heck.pPager);.  
35dc0 73 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20 6d  sCheck.mxErr = m
35dd0 78 45 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e  xErr;.  sCheck.n
35de0 45 72 72 20 3d 20 30 3b 0a 20 20 73 43 68 65 63  Err = 0;.  sChec
35df0 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  k.mallocFailed =
35e00 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30   0;.  *pnErr = 0
35e10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
35e20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
35e30 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75  .  if( pBt->nTru
35e40 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 43 68  nc!=0 ){.    sCh
35e50 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74 2d  eck.nPage = pBt-
35e60 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e  >nTrunc;.  }.#en
35e70 64 69 66 0a 20 20 69 66 28 20 73 43 68 65 63 6b  dif.  if( sCheck
35e80 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  .nPage==0 ){.   
35e90 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
35ea0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
35eb0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
35ec0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
35ed0 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  0;.  }.  sCheck.
35ee0 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 4d  anRef = sqlite3M
35ef0 61 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b 2e 6e  alloc( (sCheck.n
35f00 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73  Page+1)*sizeof(s
35f10 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20  Check.anRef[0]) 
35f20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63 6b  );.  if( !sCheck
35f30 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75 6e  .anRef ){.    un
35f40 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
35f50 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45  d(pBt);.    *pnE
35f60 72 72 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69  rr = 1;.    sqli
35f70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
35f80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
35f90 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
35fa0 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20  <=sCheck.nPage; 
35fb0 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52  i++){ sCheck.anR
35fc0 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69  ef[i] = 0; }.  i
35fd0 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f   = PENDING_BYTE_
35fe0 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28  PAGE(pBt);.  if(
35ff0 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
36000 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61   ){.    sCheck.a
36010 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d  nRef[i] = 1;.  }
36020 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
36030 75 6d 49 6e 69 74 28 26 73 43 68 65 63 6b 2e 65  umInit(&sCheck.e
36040 72 72 4d 73 67 2c 20 7a 45 72 72 2c 20 73 69 7a  rrMsg, zErr, siz
36050 65 6f 66 28 7a 45 72 72 29 2c 20 32 30 30 30 30  eof(zErr), 20000
36060 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
36070 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
36080 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a  the freelist.  *
36090 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73  /.  checkList(&s
360a0 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79  Check, 1, get4by
360b0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
360c0 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20  >aData[32]),.   
360d0 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
360e0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
360f0 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69  aData[36]), "Mai
36100 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a  n freelist: ");.
36110 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20  .  /* Check all 
36120 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  the tables..  */
36130 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
36140 6f 6f 74 20 26 26 20 73 43 68 65 63 6b 2e 6d 78  oot && sCheck.mx
36150 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Err; i++){.    i
36160 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29  f( aRoot[i]==0 )
36170 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64   continue;.#ifnd
36180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
36190 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
361a0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
361b0 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20  m && aRoot[i]>1 
361c0 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74  ){.      checkPt
361d0 72 6d 61 70 28 26 73 43 68 65 63 6b 2c 20 61 52  rmap(&sCheck, aR
361e0 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52  oot[i], PTRMAP_R
361f0 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a  OOTPAGE, 0, 0);.
36200 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
36210 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 26   checkTreePage(&
36220 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d  sCheck, aRoot[i]
36230 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66 20 74 72  , 0, "List of tr
36240 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20  ee roots: ");.  
36250 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
36260 65 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20  e every page in 
36270 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 66 65  the file is refe
36280 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f  renced.  */.  fo
36290 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b  r(i=1; i<=sCheck
362a0 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65 63 6b  .nPage && sCheck
362b0 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69  .mxErr; i++){.#i
362c0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
362d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
362e0 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  if( sCheck.anRef
362f0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
36300 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  checkAppendMsg(&
36310 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65  sCheck, 0, "Page
36320 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65   %d is never use
36330 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65  d", i);.    }.#e
36340 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  lse.    /* If th
36350 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
36360 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
36370 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20 74 61   make sure no ta
36380 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20  bles contain.   
36390 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
363a0 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  o pointer-map pa
363b0 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ges..    */.    
363c0 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  if( sCheck.anRef
363d0 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20 20 20  [i]==0 && .     
363e0 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f    (PTRMAP_PAGENO
363f0 28 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21  (pBt, i)!=i || !
36400 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
36410 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
36420 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
36430 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73  , 0, "Page %d is
36440 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29   never used", i)
36450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
36460 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21  sCheck.anRef[i]!
36470 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50  =0 && .       (P
36480 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
36490 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e  , i)==i && pBt->
364a0 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20  autoVacuum) ){. 
364b0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
364c0 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
364d0 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67  "Pointer map pag
364e0 65 20 25 64 20 69 73 20 72 65 66 65 72 65 6e 63  e %d is referenc
364f0 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23  ed", i);.    }.#
36500 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
36510 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 61  Make sure this a
36520 6e 61 6c 79 73 69 73 20 64 69 64 20 6e 6f 74 20  nalysis did not 
36530 6c 65 61 76 65 20 61 6e 79 20 75 6e 72 65 66 28  leave any unref(
36540 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75  ) pages.  */.  u
36550 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
36560 65 64 28 70 42 74 29 3b 0a 20 20 69 66 28 20 6e  ed(pBt);.  if( n
36570 52 65 66 20 21 3d 20 73 71 6c 69 74 65 33 50 61  Ref != sqlite3Pa
36580 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
36590 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
365a0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  checkAppendMsg(&
365b0 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  sCheck, 0, .    
365c0 20 20 22 4f 75 74 73 74 61 6e 64 69 6e 67 20 70    "Outstanding p
365d0 61 67 65 20 63 6f 75 6e 74 20 67 6f 65 73 20 66  age count goes f
365e0 72 6f 6d 20 25 64 20 74 6f 20 25 64 20 64 75 72  rom %d to %d dur
365f0 69 6e 67 20 74 68 69 73 20 61 6e 61 6c 79 73 69  ing this analysi
36600 73 22 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c 20  s",.      nRef, 
36610 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
36620 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
36630 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ).    );.  }..  
36640 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61 6e 64  /* Clean  up and
36650 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a   report errors..
36660 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
36670 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 73  reeLeave(p);.  s
36680 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 68 65  qlite3_free(sChe
36690 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 69 66 28  ck.anRef);.  if(
366a0 20 73 43 68 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61   sCheck.mallocFa
366b0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
366c0 74 65 33 53 74 72 41 63 63 75 6d 52 65 73 65 74  te3StrAccumReset
366d0 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73 67 29  (&sCheck.errMsg)
366e0 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 73  ;.    *pnErr = s
366f0 43 68 65 63 6b 2e 6e 45 72 72 2b 31 3b 0a 20 20  Check.nErr+1;.  
36700 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
36710 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63    *pnErr = sChec
36720 6b 2e 6e 45 72 72 3b 0a 20 20 69 66 28 20 73 43  k.nErr;.  if( sC
36730 68 65 63 6b 2e 6e 45 72 72 3d 3d 30 20 29 20 73  heck.nErr==0 ) s
36740 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 52 65  qlite3StrAccumRe
36750 73 65 74 28 26 73 43 68 65 63 6b 2e 65 72 72 4d  set(&sCheck.errM
36760 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  sg);.  return sq
36770 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
36780 69 73 68 28 26 73 43 68 65 63 6b 2e 65 72 72 4d  ish(&sCheck.errM
36790 73 67 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  sg);.}.#endif /*
367a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
367b0 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
367c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
367d0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
367e0 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
367f0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  g database file.
36800 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
36810 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76   filename is inv
36820 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61  ariant as long a
36830 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a  s the pager is.*
36840 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20  * open so it is 
36850 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77  safe to access w
36860 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61  ithout the BtSha
36870 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f  red mutex..*/.co
36880 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
36890 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
368a0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
368b0 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
368c0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
368d0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
368e0 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74  rFilename(p->pBt
368f0 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
36900 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
36910 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
36920 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
36930 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
36940 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
36950 54 68 65 20 70 61 67 65 72 20 64 69 72 65 63 74  The pager direct
36960 6f 72 79 20 6e 61 6d 65 20 69 73 20 69 6e 76 61  ory name is inva
36970 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73  riant as long as
36980 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a   the pager is.**
36990 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73   open so it is s
369a0 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69  afe to access wi
369b0 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72  thout the BtShar
369c0 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e  ed mutex..*/.con
369d0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
369e0 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
369f0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
36a00 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
36a10 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
36a20 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  rn sqlite3PagerD
36a30 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  irname(p->pBt->p
36a40 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
36a50 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
36a60 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
36a70 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69  nal file for thi
36a80 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  s database. The 
36a90 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
36aa0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
36ab0 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61  is the same rega
36ac0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
36ad0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
36ae0 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
36af0 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a  reated or not..*
36b00 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6a  *.** The pager j
36b10 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
36b20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20  is invariant as 
36b30 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65  long as the page
36b40 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20  r is.** open so 
36b50 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63  it is safe to ac
36b60 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65  cess without the
36b70 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e   BtShared mutex.
36b80 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
36b90 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
36ba0 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65  ournalname(Btree
36bb0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
36bc0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
36bd0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
36be0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
36bf0 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50  lname(p->pBt->pP
36c00 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ager);.}..#ifnde
36c10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
36c20 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  CUUM./*.** Copy 
36c30 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
36c40 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20  tent of pBtFrom 
36c50 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74  into pBtTo.  A t
36c60 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75  ransaction.** mu
36c70 73 74 20 62 65 20 61 63 74 69 76 65 20 66 6f 72  st be active for
36c80 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a   both files..**.
36c90 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66  ** The size of f
36ca0 69 6c 65 20 70 54 6f 20 6d 61 79 20 62 65 20 72  ile pTo may be r
36cb0 65 64 75 63 65 64 20 62 79 20 74 68 69 73 20 6f  educed by this o
36cc0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20  peration..** If 
36cd0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
36ce0 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ong, the transac
36cf0 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 69 73 20 72  tion on pTo is r
36d00 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 0a 2a 2a 0a  olled back. .**.
36d10 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
36d20 2c 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  , CommitPhaseOne
36d30 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  () may be called
36d40 20 6f 6e 20 70 54 6f 20 62 65 66 6f 72 65 20 72   on pTo before r
36d50 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 20 54 68  eturning. .** Th
36d60 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
36d70 66 69 6e 69 73 68 20 63 6f 6d 6d 69 74 74 69 6e  finish committin
36d80 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
36d90 6e 20 6f 6e 20 70 54 6f 20 62 79 20 63 61 6c 6c  n on pTo by call
36da0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  ing.** sqlite3Bt
36db0 72 65 65 43 6f 6d 6d 69 74 28 29 2e 0a 2a 2f 0a  reeCommit()..*/.
36dc0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
36dd0 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
36de0 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
36df0 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  m){.  int rc = S
36e00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f  QLITE_OK;.  Pgno
36e10 20 69 3b 0a 0a 20 20 50 67 6e 6f 20 6e 46 72 6f   i;..  Pgno nFro
36e20 6d 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 4e 75  mPage;     /* Nu
36e30 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
36e40 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 50 67 6e 6f   pFrom */.  Pgno
36e50 20 6e 54 6f 50 61 67 65 3b 20 20 20 20 20 20 20   nToPage;       
36e60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
36e70 65 73 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 50  es in pTo */.  P
36e80 67 6e 6f 20 6e 4e 65 77 50 61 67 65 3b 20 20 20  gno nNewPage;   
36e90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
36ea0 70 61 67 65 73 20 69 6e 20 70 54 6f 20 61 66 74  pages in pTo aft
36eb0 65 72 20 74 68 65 20 63 6f 70 79 20 2a 2f 0a 0a  er the copy */..
36ec0 20 20 50 67 6e 6f 20 69 53 6b 69 70 3b 20 20 20    Pgno iSkip;   
36ed0 20 20 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e 67        /* Pending
36ee0 20 62 79 74 65 20 70 61 67 65 20 69 6e 20 70 54   byte page in pT
36ef0 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 50 61  o */.  int nToPa
36f00 67 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 50 61  geSize;    /* Pa
36f10 67 65 20 73 69 7a 65 20 6f 66 20 70 54 6f 20 69  ge size of pTo i
36f20 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
36f30 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3b 20   nFromPageSize; 
36f40 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66   /* Page size of
36f50 20 70 46 72 6f 6d 20 69 6e 20 62 79 74 65 73 20   pFrom in bytes 
36f60 2a 2f 0a 0a 20 20 42 74 53 68 61 72 65 64 20 2a  */..  BtShared *
36f70 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74  pBtTo = pTo->pBt
36f80 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
36f90 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70  tFrom = pFrom->p
36fa0 42 74 3b 0a 20 20 70 42 74 54 6f 2d 3e 64 62 20  Bt;.  pBtTo->db 
36fb0 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20 70 42 74  = pTo->db;.  pBt
36fc0 46 72 6f 6d 2d 3e 64 62 20 3d 20 70 46 72 6f 6d  From->db = pFrom
36fd0 2d 3e 64 62 3b 0a 0a 20 20 6e 54 6f 50 61 67 65  ->db;..  nToPage
36fe0 53 69 7a 65 20 3d 20 70 42 74 54 6f 2d 3e 70 61  Size = pBtTo->pa
36ff0 67 65 53 69 7a 65 3b 0a 20 20 6e 46 72 6f 6d 50  geSize;.  nFromP
37000 61 67 65 53 69 7a 65 20 3d 20 70 42 74 46 72 6f  ageSize = pBtFro
37010 6d 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20  m->pageSize;..  
37020 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73  if( pTo->inTrans
37030 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  !=TRANS_WRITE ||
37040 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21   pFrom->inTrans!
37050 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
37060 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37070 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
37080 66 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f  f( pBtTo->pCurso
37090 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
370a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
370b0 0a 0a 20 20 6e 54 6f 50 61 67 65 20 3d 20 70 61  ..  nToPage = pa
370c0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
370d0 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e  To->pPager);.  n
370e0 46 72 6f 6d 50 61 67 65 20 3d 20 70 61 67 65 72  FromPage = pager
370f0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f  Pagecount(pBtFro
37100 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53  m->pPager);.  iS
37110 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  kip = PENDING_BY
37120 54 45 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a  TE_PAGE(pBtTo);.
37130 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 6e  .  /* Variable n
37140 4e 65 77 50 61 67 65 20 69 73 20 74 68 65 20 6e  NewPage is the n
37150 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72  umber of pages r
37160 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
37170 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e   the.  ** conten
37180 74 73 20 6f 66 20 70 46 72 6f 6d 20 75 73 69 6e  ts of pFrom usin
37190 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  g the current pa
371a0 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f 2e 0a  ge-size of pTo..
371b0 20 20 2a 2f 0a 20 20 6e 4e 65 77 50 61 67 65 20    */.  nNewPage 
371c0 3d 20 28 28 69 36 34 29 6e 46 72 6f 6d 50 61 67  = ((i64)nFromPag
371d0 65 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50 61  e * (i64)nFromPa
371e0 67 65 53 69 7a 65 20 2b 20 28 69 36 34 29 6e 54  geSize + (i64)nT
371f0 6f 50 61 67 65 53 69 7a 65 20 2d 20 31 29 20 2f  oPageSize - 1) /
37200 20 0a 20 20 20 20 20 20 28 69 36 34 29 6e 54 6f   .      (i64)nTo
37210 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 66 6f 72  PageSize;..  for
37220 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=1; rc==SQLITE
37230 5f 4f 4b 20 26 26 20 28 69 3c 3d 6e 54 6f 50 61  _OK && (i<=nToPa
37240 67 65 20 7c 7c 20 69 3c 3d 6e 4e 65 77 50 61 67  ge || i<=nNewPag
37250 65 29 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f  e); i++){..    /
37260 2a 20 4a 6f 75 72 6e 61 6c 20 74 68 65 20 6f 72  * Journal the or
37270 69 67 69 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20  iginal page..   
37280 20 2a 2a 0a 20 20 20 20 2a 2a 20 69 53 6b 69 70   **.    ** iSkip
37290 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
372a0 62 65 72 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  ber of the locki
372b0 6e 67 20 70 61 67 65 20 28 50 45 4e 44 49 4e 47  ng page (PENDING
372c0 5f 42 59 54 45 5f 50 41 47 45 29 0a 20 20 20 20  _BYTE_PAGE).    
372d0 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 2a  ** in database *
372e0 70 54 6f 20 28 62 65 66 6f 72 65 20 74 68 65 20  pTo (before the 
372f0 63 6f 70 79 29 2e 20 54 68 69 73 20 70 61 67 65  copy). This page
37300 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
37310 6e 20 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  n .    ** into t
37320 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
37330 20 55 6e 6c 65 73 73 20 69 3d 3d 69 53 6b 69 70   Unless i==iSkip
37340 20 6f 72 20 74 68 65 20 70 61 67 65 20 77 61 73   or the page was
37350 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 70 72 65 73   not.    ** pres
37360 65 6e 74 20 69 6e 20 70 54 6f 20 62 65 66 6f 72  ent in pTo befor
37370 65 20 74 68 65 20 63 6f 70 79 20 6f 70 65 72 61  e the copy opera
37380 74 69 6f 6e 2c 20 6a 6f 75 72 6e 61 6c 20 70 61  tion, journal pa
37390 67 65 20 69 20 66 72 6f 6d 20 70 54 6f 2e 0a 20  ge i from pTo.. 
373a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 21     */.    if( i!
373b0 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e 54 6f  =iSkip && i<=nTo
373c0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 44 62  Page ){.      Db
373d0 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 3d 20  Page *pDbPage = 
373e0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
373f0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
37400 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  tTo->pPager, i, 
37410 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
37420 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37430 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
37440 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
37450 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
37460 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
37470 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e 6e 46  QLITE_OK && i>nF
37480 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 20  romPage ){.     
37490 20 20 20 20 20 2f 2a 20 59 65 61 68 2e 20 20 49       /* Yeah.  I
374a0 74 20 73 65 65 6d 73 20 77 69 65 72 64 20 74 6f  t seems wierd to
374b0 20 63 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28   call DontWrite(
374c0 29 20 72 69 67 68 74 20 61 66 74 65 72 20 57 72  ) right after Wr
374d0 69 74 65 28 29 2e 20 42 75 74 0a 20 20 20 20 20  ite(). But.     
374e0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
374f0 62 65 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  because the name
37500 73 20 6f 66 20 74 68 6f 73 65 20 70 72 6f 63 65  s of those proce
37510 64 75 72 65 73 20 64 6f 20 6e 6f 74 20 65 78 61  dures do not exa
37520 63 74 6c 79 20 0a 20 20 20 20 20 20 20 20 20 20  ctly .          
37530 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 77 68 61  ** represent wha
37540 74 20 74 68 65 79 20 64 6f 2e 20 20 57 72 69 74  t they do.  Writ
37550 65 28 29 20 72 65 61 6c 6c 79 20 6d 65 61 6e 73  e() really means
37560 20 22 70 75 74 20 74 68 69 73 20 70 61 67 65 20   "put this page 
37570 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
37580 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
37590 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b 20 69 74  rnal and mark it
375a0 20 61 73 20 64 69 72 74 79 20 73 6f 20 74 68 61   as dirty so tha
375b0 74 20 69 74 20 77 69 6c 6c 20 62 65 20 77 72 69  t it will be wri
375c0 74 74 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  tten.          *
375d0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
375e0 65 20 66 69 6c 65 20 6c 61 74 65 72 2e 22 20 20  e file later."  
375f0 44 6f 6e 74 57 72 69 74 65 28 29 20 75 6e 64 6f  DontWrite() undo
37600 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  es the second pa
37610 72 74 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20  rt of.          
37620 2a 2a 20 74 68 61 74 20 61 6e 64 20 70 72 65 76  ** that and prev
37630 65 6e 74 73 20 74 68 65 20 70 61 67 65 20 66 72  ents the page fr
37640 6f 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  om being written
37650 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
37660 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20  . The.          
37670 2a 2a 20 70 61 67 65 20 69 73 20 73 74 69 6c 6c  ** page is still
37680 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   on the rollback
37690 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68   journal, though
376a0 2e 20 20 41 6e 64 20 74 68 61 74 20 69 73 20 74  .  And that is t
376b0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  he .          **
376c0 20 77 68 6f 6c 65 20 70 6f 69 6e 74 20 6f 66 20   whole point of 
376d0 74 68 69 73 20 62 6c 6f 63 6b 3a 20 74 6f 20 70  this block: to p
376e0 75 74 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  ut pages on the 
376f0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
37700 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  . .          */.
37710 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
37720 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
37730 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
37740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37750 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37760 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
37770 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
37780 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 74 68 65  /* Overwrite the
37790 20 64 61 74 61 20 69 6e 20 70 61 67 65 20 69 20   data in page i 
377a0 6f 66 20 74 68 65 20 74 61 72 67 65 74 20 64 61  of the target da
377b0 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 69 66  tabase */.    if
377c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
377d0 26 26 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69  && i!=iSkip && i
377e0 3c 3d 6e 4e 65 77 50 61 67 65 20 29 7b 0a 0a 20  <=nNewPage ){.. 
377f0 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 54 6f       DbPage *pTo
37800 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
37810 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
37820 66 66 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  ff;..      rc = 
37830 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
37840 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69  pBtTo->pPager, i
37850 2c 20 26 70 54 6f 50 61 67 65 29 3b 0a 20 20 20  , &pToPage);.   
37860 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37880 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37890 72 57 72 69 74 65 28 70 54 6f 50 61 67 65 29 3b  rWrite(pToPage);
378a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
378b0 66 6f 72 28 0a 20 20 20 20 20 20 20 20 69 4f 66  for(.        iOf
378c0 66 3d 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53  f=(i-1)*nToPageS
378d0 69 7a 65 3b 20 0a 20 20 20 20 20 20 20 20 72 63  ize; .        rc
378e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
378f0 4f 66 66 3c 69 2a 6e 54 6f 50 61 67 65 53 69 7a  Off<i*nToPageSiz
37900 65 3b 20 0a 20 20 20 20 20 20 20 20 69 4f 66 66  e; .        iOff
37910 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a   += nFromPageSiz
37920 65 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  e.      ){.     
37930 20 20 20 44 62 50 61 67 65 20 2a 70 46 72 6f 6d     DbPage *pFrom
37940 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
37950 20 20 50 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28    Pgno iFrom = (
37960 69 4f 66 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69  iOff/nFromPageSi
37970 7a 65 29 2b 31 3b 0a 0a 20 20 20 20 20 20 20 20  ze)+1;..        
37980 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49  if( iFrom==PENDI
37990 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
379a0 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  From) ){.       
379b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
379c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
379d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
379e0 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50  rGet(pBtFrom->pP
379f0 61 67 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46  ager, iFrom, &pF
37a00 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  romPage);.      
37a10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
37a30 20 63 68 61 72 20 2a 7a 54 6f 20 3d 20 73 71 6c   char *zTo = sql
37a40 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
37a50 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20  (pToPage);.     
37a60 20 20 20 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d       char *zFrom
37a70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
37a80 65 74 44 61 74 61 28 70 46 72 6f 6d 50 61 67 65  etData(pFromPage
37a90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
37aa0 20 6e 43 6f 70 79 3b 0a 0a 20 20 20 20 20 20 20   nCopy;..       
37ab0 20 20 20 69 66 28 20 6e 46 72 6f 6d 50 61 67 65     if( nFromPage
37ac0 53 69 7a 65 3e 3d 6e 54 6f 50 61 67 65 53 69 7a  Size>=nToPageSiz
37ad0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
37ae0 20 7a 46 72 6f 6d 20 2b 3d 20 28 28 69 2d 31 29   zFrom += ((i-1)
37af0 2a 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 28  *nToPageSize - (
37b00 28 69 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50  (iFrom-1)*nFromP
37b10 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
37b20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e         nCopy = n
37b30 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ToPageSize;.    
37b40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
37b50 20 20 20 20 20 20 20 20 20 7a 54 6f 20 2b 3d 20           zTo += 
37b60 28 28 28 69 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f  (((iFrom-1)*nFro
37b70 6d 50 61 67 65 53 69 7a 65 29 20 2d 20 28 69 2d  mPageSize) - (i-
37b80 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65 29 3b  1)*nToPageSize);
37b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
37ba0 70 79 20 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69  py = nFromPageSi
37bb0 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ze;.          }.
37bc0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
37bd0 79 28 7a 54 6f 2c 20 7a 46 72 6f 6d 2c 20 6e 43  y(zTo, zFrom, nC
37be0 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opy);.          
37bf0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
37c00 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20  f(pFromPage);.  
37c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37c20 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 50 61  .      if( pToPa
37c30 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65  ge ){.        Me
37c40 6d 50 61 67 65 20 2a 70 20 3d 20 28 4d 65 6d 50  mPage *p = (MemP
37c50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
37c60 65 72 47 65 74 45 78 74 72 61 28 70 54 6f 50 61  erGetExtra(pToPa
37c70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ge);.        p->
37c80 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
37c90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
37ca0 55 6e 72 65 66 28 70 54 6f 50 61 67 65 29 3b 0a  Unref(pToPage);.
37cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
37cc0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 6e 67  }..  /* If thing
37cd0 73 20 68 61 76 65 20 77 6f 72 6b 65 64 20 73 6f  s have worked so
37ce0 20 66 61 72 2c 20 74 68 65 20 64 61 74 61 62 61   far, the databa
37cf0 73 65 20 66 69 6c 65 20 6d 61 79 20 6e 65 65 64  se file may need
37d00 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 74 72 75   to be .  ** tru
37d10 6e 63 61 74 65 64 2e 20 54 68 65 20 63 6f 6d 70  ncated. The comp
37d20 6c 65 78 20 70 61 72 74 20 69 73 20 74 68 61 74  lex part is that
37d30 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
37d40 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  be truncated to.
37d50 20 20 2a 2a 20 61 20 73 69 7a 65 20 74 68 61 74    ** a size that
37d60 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
37d70 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 6e  er multiple of n
37d80 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 74 68 65  ToPageSize - the
37d90 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61   current.  ** pa
37da0 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
37db0 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69  the pager associ
37dc0 61 74 65 64 20 77 69 74 68 20 42 2d 54 72 65 65  ated with B-Tree
37dd0 20 70 54 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   pTo..  **.  ** 
37de0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 61 79  For example, say
37df0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
37e00 66 20 70 54 6f 20 69 73 20 32 30 34 38 20 62 79  f pTo is 2048 by
37e10 74 65 73 20 61 6e 64 20 74 68 65 20 6f 72 69 67  tes and the orig
37e20 69 6e 61 6c 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  inal .  ** numbe
37e30 72 20 6f 66 20 70 61 67 65 73 20 69 73 20 35 20  r of pages is 5 
37e40 28 31 30 20 4b 42 20 66 69 6c 65 29 2e 20 49 66  (10 KB file). If
37e50 20 70 46 72 6f 6d 20 68 61 73 20 61 20 70 61 67   pFrom has a pag
37e60 65 20 73 69 7a 65 20 6f 66 20 31 30 32 34 20 0a  e size of 1024 .
37e70 20 20 2a 2a 20 62 79 74 65 73 20 61 6e 64 20 39    ** bytes and 9
37e80 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
37e90 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
37ea0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 39  e truncated to 9
37eb0 4b 42 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  KB..  */.  if( r
37ec0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37ed0 20 20 20 20 69 66 28 20 6e 46 72 6f 6d 50 61 67      if( nFromPag
37ee0 65 53 69 7a 65 21 3d 6e 54 6f 50 61 67 65 53 69  eSize!=nToPageSi
37ef0 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ze ){.      sqli
37f00 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
37f10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
37f20 6c 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  le(pBtTo->pPager
37f30 29 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53 69  );.      i64 iSi
37f40 7a 65 20 3d 20 28 69 36 34 29 6e 46 72 6f 6d 50  ze = (i64)nFromP
37f50 61 67 65 53 69 7a 65 20 2a 20 28 69 36 34 29 6e  ageSize * (i64)n
37f60 46 72 6f 6d 50 61 67 65 3b 0a 20 20 20 20 20 20  FromPage;.      
37f70 69 36 34 20 69 4e 6f 77 20 3d 20 28 69 36 34 29  i64 iNow = (i64)
37f80 28 28 6e 54 6f 50 61 67 65 3e 6e 4e 65 77 50 61  ((nToPage>nNewPa
37f90 67 65 29 3f 6e 54 6f 50 61 67 65 3a 6e 4e 65 77  ge)?nToPage:nNew
37fa0 50 61 67 65 29 20 2a 20 28 69 36 34 29 6e 54 6f  Page) * (i64)nTo
37fb0 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20  PageSize; .     
37fc0 20 69 36 34 20 69 50 65 6e 64 69 6e 67 20 3d 20   i64 iPending = 
37fd0 28 28 69 36 34 29 50 45 4e 44 49 4e 47 5f 42 59  ((i64)PENDING_BY
37fe0 54 45 5f 50 41 47 45 28 70 42 74 54 6f 29 2d 31  TE_PAGE(pBtTo)-1
37ff0 29 20 2a 28 69 36 34 29 6e 54 6f 50 61 67 65 53  ) *(i64)nToPageS
38000 69 7a 65 3b 0a 20 20 0a 20 20 20 20 20 20 61 73  ize;.  .      as
38010 73 65 72 74 28 20 69 53 69 7a 65 3c 3d 69 4e 6f  sert( iSize<=iNo
38020 77 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  w );.  .      /*
38030 20 43 6f 6d 6d 69 74 20 70 68 61 73 65 20 6f 6e   Commit phase on
38040 65 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  e syncs the jour
38050 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  nal file associa
38060 74 65 64 20 77 69 74 68 20 70 54 6f 20 0a 20 20  ted with pTo .  
38070 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
38080 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  g the original d
38090 61 74 61 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  ata. It does not
380a0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
380b0 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  se file.      **
380c0 20 69 74 73 65 6c 66 2e 20 41 66 74 65 72 20 64   itself. After d
380d0 6f 69 6e 67 20 74 68 69 73 20 69 74 20 69 73 20  oing this it is 
380e0 73 61 66 65 20 74 6f 20 75 73 65 20 4f 73 54 72  safe to use OsTr
380f0 75 6e 63 61 74 65 28 29 20 61 6e 64 20 6f 74 68  uncate() and oth
38100 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
38110 20 41 50 49 73 20 6f 6e 20 74 68 65 20 64 61 74   APIs on the dat
38120 61 62 61 73 65 20 66 69 6c 65 20 64 69 72 65 63  abase file direc
38130 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tly..      */.  
38140 20 20 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20      pBtTo->db = 
38150 70 54 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 72  pTo->db;.      r
38160 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
38170 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
38180 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 30 2c  BtTo->pPager, 0,
38190 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66   0, 1);.      if
381a0 28 20 69 53 69 7a 65 3c 69 4e 6f 77 20 26 26 20  ( iSize<iNow && 
381b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
381c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
381d0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
381e0 70 46 69 6c 65 2c 20 69 53 69 7a 65 29 3b 0a 20  pFile, iSize);. 
381f0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
38200 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 68 61 74  /* The loop that
38210 20 63 6f 70 69 65 64 20 64 61 74 61 20 66 72 6f   copied data fro
38220 6d 20 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d  m database pFrom
38230 20 74 6f 20 70 54 6f 20 64 69 64 20 6e 6f 74 0a   to pTo did not.
38240 20 20 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74        ** populat
38250 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
38260 67 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 70  ge of database p
38270 54 6f 2e 20 49 66 20 74 68 65 20 70 61 67 65 2d  To. If the page-
38280 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  size of.      **
38290 20 70 46 72 6f 6d 20 69 73 20 73 6d 61 6c 6c 65   pFrom is smalle
382a0 72 20 74 68 61 6e 20 74 68 61 74 20 6f 66 20 70  r than that of p
382b0 54 6f 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  To, this means s
382c0 6f 6d 65 20 64 61 74 61 20 77 69 6c 6c 0a 20 20  ome data will.  
382d0 20 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65 20      ** not have 
382e0 62 65 65 6e 20 63 6f 70 69 65 64 2e 20 0a 20 20  been copied. .  
382f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
38300 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f 70 69 65  This block copie
38310 73 20 74 68 65 20 6d 69 73 73 69 6e 67 20 64 61  s the missing da
38320 74 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  ta from database
38330 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 0a 20   pFrom to pTo . 
38340 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 66 69       ** using fi
38350 6c 65 20 41 50 49 73 2e 20 54 68 69 73 20 69 73  le APIs. This is
38360 20 73 61 66 65 20 62 65 63 61 75 73 65 20 61 74   safe because at
38370 20 74 68 69 73 20 70 6f 69 6e 74 20 77 65 20 6b   this point we k
38380 6e 6f 77 20 74 68 61 74 0a 20 20 20 20 20 20 2a  now that.      *
38390 2a 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 72 69  * all of the ori
383a0 67 69 6e 61 6c 20 64 61 74 61 20 66 72 6f 6d 20  ginal data from 
383b0 70 54 6f 20 68 61 73 20 62 65 65 6e 20 73 79 6e  pTo has been syn
383c0 63 65 64 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ced into the .  
383d0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
383e0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
383f0 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20 73  nt it would be s
38400 61 66 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69  afe to do anythi
38410 6e 67 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 61  ng at.      ** a
38420 6c 6c 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ll to the databa
38430 73 65 20 66 69 6c 65 20 65 78 63 65 70 74 20 74  se file except t
38440