/ Hex Artifact Content
Login

Artifact 13e33e85103c19b114ce1cfdedd2d3e2647de290:


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 36 34 30 20 32 30 30 39 2f 30  c,v 1.640 2009/0
0190: 36 2f 32 33 20 31 35 3a 34 33 3a 34 30 20 64 61  6/23 15:43:40 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 31  ite3BtreeTrace=1
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 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f....#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  CACHE./*.** A li
0450: 73 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f  st of BtShared o
0460: 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20  bjects that are 
0470: 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72  eligible for par
0480: 74 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e  ticipation.** in
0490: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
04a0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61  This variable ha
04b0: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72  s file scope dur
04c0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  ing normal build
04d0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65  s,.** but the te
04e0: 73 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73  st harness needs
04f0: 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f   to access it so
0500: 20 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62   we make it glob
0510: 61 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20  al for .** test 
0520: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63  builds..**.** Ac
0530: 63 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72  cess to this var
0540: 69 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74  iable is protect
0550: 65 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54  ed by SQLITE_MUT
0560: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
0570: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0580: 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64  TE_TEST.BtShared
0590: 20 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c   *SQLITE_WSD sql
05a0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
05b0: 69 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ist = 0;.#else.s
05c0: 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a  tatic BtShared *
05d0: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
05e0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05f0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  t = 0;.#endif.#e
0600: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0610: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0620: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0630: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0640: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0650: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0660: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0670: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0680: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0690: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
06a0: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06c0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06d0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06e0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06f0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
0700: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0710: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0720: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0730: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0740: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0750: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0760: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0770: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0780: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0790: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
07a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
07b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
07c0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
07d0: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
07e0: 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 52 65 61   int checkForRea
07f0: 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65  dConflicts(Btree
0800: 2a 2c 20 50 67 6e 6f 2c 20 42 74 43 75 72 73 6f  *, Pgno, BtCurso
0810: 72 2a 2c 20 69 36 34 29 3b 0a 0a 0a 23 69 66 64  r*, i64);...#ifd
0820: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0830: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0840: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0850: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0860: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0870: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0880: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0890: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
08a0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
08b0: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
08c0: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
08d0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
08e0: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
08f0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0900: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0910: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0920: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0930: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0940: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0950: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0960: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0970: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0980: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0990: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
09a0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
09b0: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
09c0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
09d0: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
09e0: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
09f0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0a00: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0a10: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0a20: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0a30: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0a40: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0a50: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0a60: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0a70: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0a80: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0a90: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 23  eTableLocks(a).#
0aa0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0ab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ac0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51 75  D_CACHE./*.** Qu
0ad0: 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 74  ery to see if bt
0ae0: 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79  ree handle p may
0af0: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
0b00: 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a  f type eLock .**
0b10: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
0b20: 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68  RITE_LOCK) on th
0b30: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
0b40: 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74  t-page iTab. Ret
0b50: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
0b60: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79   if the lock may
0b70: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79   be obtained (by
0b80: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53   calling.** setS
0b90: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ba0: 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54  ock()), or SQLIT
0bb0: 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e  E_LOCKED if not.
0bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71  .*/.static int q
0bd0: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
0bf0: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
0c00: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
0c10: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
0c20: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
0c30: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
0c40: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
0c50: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
0c60: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
0c70: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
0c80: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
0c90: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
0ca0: 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
0cb0: 72 65 71 75 65 73 74 69 6e 67 20 61 20 77 72 69  requesting a wri
0cc0: 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  te-lock, then th
0cd0: 65 20 42 74 72 65 65 20 6d 75 73 74 20 68 61 76  e Btree must hav
0ce0: 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a  e an open write.
0cf0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
0d00: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41   on this file. A
0d10: 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66  nd, obviously, f
0d20: 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f  or this to be so
0d30: 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73   there .  ** mus
0d40: 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  t be an open wri
0d50: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
0d60: 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  n the file itsel
0d70: 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  f..  */.  assert
0d80: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
0d90: 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70  CK || (p==pBt->p
0da0: 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54  Writer && p->inT
0db0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
0dc0: 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
0dd0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
0de0: 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
0df0: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
0e00: 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  ITE );.  .  /* T
0e10: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
0e20: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  f the shared-cac
0e30: 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  he is not enable
0e40: 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73  d */.  if( !p->s
0e50: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72  harable ){.    r
0e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0e70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  .  }..  /* If so
0e80: 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
0e90: 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ion is holding a
0ea0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
0eb0: 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65  , the.  ** reque
0ec0: 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f  sted lock may no
0ed0: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20  t be obtained.. 
0ee0: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   */.  if( pBt->p
0ef0: 57 72 69 74 65 72 21 3d 70 20 26 26 20 70 42 74  Writer!=p && pBt
0f00: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ->isExclusive ){
0f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
0f20: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
0f30: 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65  >db, pBt->pWrite
0f40: 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  r->db);.    retu
0f50: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
0f60: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
0f70: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61 6c  }..  /* This (al
0f80: 6f 6e 67 20 77 69 74 68 20 73 65 74 53 68 61 72  ong with setShar
0f90: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0fa0: 28 29 29 20 69 73 20 77 68 65 72 65 0a 20 20 2a  ()) is where.  *
0fb0: 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  * the ReadUncomm
0fc0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 64 65  itted flag is de
0fd0: 61 6c 74 20 77 69 74 68 2e 0a 20 20 2a 2a 20 49  alt with..  ** I
0fe0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
0ff0: 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72  querying for a r
1000: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 61 6e 79 20  ead-lock on any 
1010: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 74 68 65 72  table.  ** other
1020: 20 74 68 61 6e 20 74 68 65 20 73 71 6c 69 74 65   than the sqlite
1030: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 74  _master table (t
1040: 61 62 6c 65 20 31 29 20 61 6e 64 20 69 66 20 74  able 1) and if t
1050: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
1060: 65 64 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  ed.  ** flag is 
1070: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  set, then the lo
1080: 63 6b 20 67 72 61 6e 74 65 64 20 65 76 65 6e 20  ck granted even 
1090: 69 66 20 74 68 65 72 65 20 61 72 65 20 77 72 69  if there are wri
10a0: 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e  te-locks.  ** on
10b0: 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61   the table. If a
10c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72   write-lock is r
10d0: 65 71 75 65 73 74 65 64 2c 20 74 68 65 20 52 65  equested, the Re
10e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
10f0: 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63  ag.  ** is not c
1100: 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a  onsidered..  **.
1110: 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e    ** In function
1120: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
1130: 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 69 66 20 61  ableLock(), if a
1140: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65   read-lock is de
1150: 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65 20 0a  manded and the .
1160: 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69    ** ReadUncommi
1170: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
1180: 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 61 64  , no entry is ad
1190: 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73  ded to the locks
11a0: 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42 74 53   list .  ** (BtS
11b0: 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20  hared.pLock)..  
11c0: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61  **.  ** To summa
11d0: 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52 65 61  rize: If the Rea
11e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
11f0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72  g is set, then r
1200: 65 61 64 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ead cursors.  **
1210: 20 6f 6e 20 6e 6f 6e 2d 73 63 68 65 6d 61 20 74   on non-schema t
1220: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 63 72 65  ables do not cre
1230: 61 74 65 20 6f 72 20 72 65 73 70 65 63 74 20 74  ate or respect t
1240: 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20  able locks. The 
1250: 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 70 72 6f  locking.  ** pro
1260: 63 65 64 75 72 65 20 66 6f 72 20 61 20 77 72 69  cedure for a wri
1270: 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e  te-cursor does n
1280: 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  ot change..  */.
1290: 20 20 69 66 28 20 0a 20 20 20 20 30 3d 3d 28 70    if( .    0==(p
12a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
12b0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
12c0: 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63  ed) || .    eLoc
12d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
12e0: 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45  .    iTab==MASTE
12f0: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1300: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1310: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1320: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1330: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
1340: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
1350: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
1360: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1370: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 20 20 2a  if(...) .      *
1380: 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  * statement is a
1390: 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
13a0: 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  of:.      **.   
13b0: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
13c0: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
13d0: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
13e0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 2a 2a  E_LOCK).      **
13f0: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20  .      ** since 
1400: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20  we know that if 
1410: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1420: 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72  K, then no other
1430: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
1440: 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20    ** may hold a 
1450: 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e  WRITE_LOCK on an
1460: 79 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20  y table in this 
1470: 66 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72  file (since ther
1480: 65 20 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  e can.      ** o
1490: 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20  nly be a single 
14a0: 77 72 69 74 65 72 29 2e 0a 20 20 20 20 20 20 2a  writer)..      *
14b0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
14c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
14d0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
14e0: 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ->eLock==WRITE_L
14f0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
1500: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
1510: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
1520: 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74  pBtree==p || pIt
1530: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
1540: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
1550: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
1560: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
1570: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
1580: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
1590: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15a0: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
15b0: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
15c0: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
15d0: 20 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b         if( eLock
15e0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a  ==WRITE_LOCK ){.
15f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1600: 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65  ( p==pBt->pWrite
1610: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
1620: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
1630: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1640: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1650: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1660: 43 41 43 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20  CACHE;.      }. 
1670: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1680: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1690: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
16a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16b0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
16c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16d0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
16e0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
16f0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1700: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
1710: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
1720: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
1730: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
1740: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
1750: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
1760: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
1770: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
1780: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1790: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
17a0: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
17b0: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53  ully. SQLITE_BUS
17c0: 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  Y and.** SQLITE_
17d0: 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62  NOMEM may also b
17e0: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  e returned..*/.s
17f0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61  tatic int setSha
1800: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1810: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
1820: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1830: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1840: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1850: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
1860: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
1870: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
1880: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1890: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
18a0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
18b0: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
18c0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
18d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
18e0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  0 );..  /* This 
18f0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1900: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1910: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1920: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1930: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1950: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
1960: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
1970: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1980: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
1990: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  k) );..  /* If t
19a0: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
19b0: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
19c0: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
19d0: 69 73 20 72 65 71 75 65 73 74 65 64 20 6f 6e 0a  is requested on.
19e0: 20 20 2a 2a 20 61 20 6e 6f 6e 2d 73 63 68 65 6d    ** a non-schem
19f0: 61 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  a table, then th
1a00: 65 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  e lock is always
1a10: 20 67 72 61 6e 74 65 64 2e 20 20 52 65 74 75 72   granted.  Retur
1a20: 6e 20 65 61 72 6c 79 0a 20 20 2a 2a 20 77 69 74  n early.  ** wit
1a30: 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65  hout adding an e
1a40: 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74 53 68  ntry to the BtSh
1a50: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e  ared.pLock list.
1a60: 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e   See.  ** commen
1a70: 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75  t in function qu
1a80: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1a90: 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f  bleLock() for mo
1aa0: 72 65 20 69 6e 66 6f 0a 20 20 2a 2a 20 6f 6e 20  re info.  ** on 
1ab0: 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 52 65 61  handling the Rea
1ac0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
1ad0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
1ae0: 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73     (p->db->flags
1af0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1b00: 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20 20 20  mmitted) && .   
1b10: 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f   (eLock==READ_LO
1b20: 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c  CK) &&.    iTabl
1b30: 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  e!=MASTER_ROOT. 
1b40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1b50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1b60: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
1b70: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
1b80: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
1b90: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
1ba0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1bb0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1bc0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1bd0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
1be0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
1bf0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
1c00: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
1c10: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
1c20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c30: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1c40: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
1c50: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
1c60: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
1c70: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
1c80: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
1c90: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
1ca0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
1cb0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
1cc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
1cd0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
1ce0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
1cf0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
1d00: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
1d10: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
1d20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d40: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
1d50: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
1d60: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
1d70: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
1d80: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
1d90: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
1da0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
1db0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
1dc0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
1dd0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
1de0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
1df0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
1e00: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1e10: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
1e20: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
1e30: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
1e40: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
1e50: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
1e60: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
1e70: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
1e80: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
1e90: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
1ea0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
1eb0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
1ec0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
1ed0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
1ee0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
1ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f00: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
1f10: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1f20: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
1f30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1f40: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
1f50: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
1f60: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
1f70: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
1f80: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
1f90: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1fa0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
1fb0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
1fc0: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2a 0a  ee handle p..**.
1fd0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1fe0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 68 61   assumes that ha
1ff0: 6e 64 6c 65 20 70 20 68 61 73 20 61 6e 20 6f 70  ndle p has an op
2000: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
2010: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
2020: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
2030: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 53 68 61  , then the BtSha
2040: 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 76 61  red.isPending va
2050: 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65  riable.** may be
2060: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c 65   incorrectly cle
2070: 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
2080: 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68 61  void clearAllSha
2090: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
20a0: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
20b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20c0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b  p->pBt;.  BtLock
20d0: 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42 74   **ppIter = &pBt
20e0: 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65  ->pLock;..  asse
20f0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2100: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2110: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2120: 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70  arable || 0==*pp
2130: 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  Iter );.  assert
2140: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29  ( p->inTrans>0 )
2150: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49  ;..  while( *ppI
2160: 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  ter ){.    BtLoc
2170: 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74  k *pLock = *ppIt
2180: 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
2190: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
21a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
21b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
21c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
21d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
21e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
21f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
2200: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
2210: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
2220: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
2230: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
2240: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
2250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2260: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
2270: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
2280: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  }..  assert( pBt
2290: 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20 7c  ->isPending==0 |
22a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
22b0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
22c0: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
22d0: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
22e0: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
22f0: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
2300: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
2310: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
2320: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
2330: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
2340: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2350: 61 6c 6c 65 64 20 77 68 65 6e 20 63 6f 6e 6e 65  alled when conne
2360: 63 74 69 6f 6e 20 70 20 69 73 20 63 6f 6e 63 6c  ction p is concl
2370: 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a  uding its .    *
2380: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2390: 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c  f there currentl
23a0: 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65  y exists a write
23b0: 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a  r, and p is not.
23c0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74      ** that writ
23d0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  er, then the num
23e0: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
23f0: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
2400: 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68   other.    ** th
2410: 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75  an the writer mu
2420: 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64  st be about to d
2430: 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  rop to zero. In 
2440: 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a  this case.    **
2450: 20 73 65 74 20 74 68 65 20 69 73 50 65 6e 64 69   set the isPendi
2460: 6e 67 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20  ng flag to 0..  
2470: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2480: 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72  here is not curr
2490: 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20  ently a writer, 
24a0: 74 68 65 6e 20 42 74 53 68 61 72 65 64 2e 69 73  then BtShared.is
24b0: 50 65 6e 64 69 6e 67 20 6d 75 73 74 0a 20 20 20  Pending must.   
24c0: 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65   ** be zero alre
24d0: 61 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78  ady. So this nex
24e0: 74 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65  t line is harmle
24f0: 73 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ss in that case.
2500: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d  .    */.    pBt-
2510: 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  >isPending = 0;.
2520: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
2530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2540: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
2550: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
2560: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2570: 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  age);  /* Forwar
2580: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a  d reference */..
2590: 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  /*.** Verify tha
25a0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
25b0: 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  ds a mutex on th
25c0: 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  e BtShared.*/.#i
25d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
25e0: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f  tic int cursorHo
25f0: 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f  ldsMutex(BtCurso
2600: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
2610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2620: 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
2630: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
2640: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2650: 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a  T_INCRBLOB./*.**
2660: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
2670: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
2680: 73 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72  st cache for cur
2690: 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79  sor pCur, if any
26a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26b0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
26c0: 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f  lowCache(BtCurso
26d0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
26e0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26f0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2700: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2710: 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
2720: 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2730: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
2740: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
2750: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
2760: 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63   cache for all c
2770: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  ursors opened.**
2780: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
2790: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
27a0: 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Bt..*/.static vo
27b0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  id invalidateAll
27c0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
27d0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
27e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
27f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2800: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2810: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70  utex) );.  for(p
2820: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
2830: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
2840: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
2850: 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20  rflowCache(p);. 
2860: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65   }.}.#else.  #de
2870: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
2880: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
2890: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
28a0: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
28b0: 61 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a  ache(x).#endif..
28c0: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
28d0: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
28e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
28f0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
2900: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
2910: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
2920: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
2930: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
2940: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
2950: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
2960: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
2970: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
2980: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
2990: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
29a0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
29b0: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
29c0: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
29d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
29e0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
29f0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
2a00: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
2a10: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
2a20: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
2a30: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
2a40: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
2a50: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
2a60: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
2a70: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2a80: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
2a90: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
2aa0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
2ab0: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
2ac0: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
2ad0: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
2ae0: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
2af0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
2b00: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
2b10: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
2b20: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
2b30: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
2b40: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
2b50: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
2b60: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
2b70: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
2b80: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
2b90: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
2ba0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
2bb0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2bc0: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
2bd0: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
2be0: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
2bf0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
2c00: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
2c10: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
2c20: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
2c30: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
2c40: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
2c50: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
2c60: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
2c70: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
2c80: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
2c90: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
2ca0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
2cb0: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
2cc0: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
2cd0: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
2ce0: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
2cf0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
2d00: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
2d10: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
2d20: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
2d30: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
2d40: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
2d50: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
2d60: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
2d70: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
2d80: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
2d90: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
2da0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
2db0: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
2dc0: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
2dd0: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
2de0: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
2df0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
2e00: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
2e10: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
2e20: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
2e30: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
2e40: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
2e50: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
2e60: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
2e70: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
2e80: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
2e90: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
2ea0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
2eb0: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
2ec0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
2ed0: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
2ee0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
2ef0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
2f00: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
2f10: 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74   above is ommitt
2f20: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
2f30: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
2f40: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
2f50: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
2f60: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
2f70: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
2f80: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
2f90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2fa0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
2fb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fc0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
2fd0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
2fe0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2ff0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3000: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
3010: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
3020: 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20     int nPage;.  
3030: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
3040: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
3050: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
3060: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
3070: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3080: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
3090: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
30a0: 65 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50  ecCreate((u32)nP
30b0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
30c0: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
30d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
30e0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
30f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3100: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
3110: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
3120: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
3130: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
3140: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
3150: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
3160: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
3170: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
3180: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3190: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
31a0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
31b0: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
31c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
31d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
31e0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
31f0: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
3200: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
3210: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
3220: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
3230: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
3240: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
3250: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
3260: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
3270: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
3280: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
3290: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
32a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
32b0: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
32c0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
32d0: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
32e0: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
32f0: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
3300: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
3310: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
3320: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
3330: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
3340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
3350: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
3360: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3370: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
3380: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
3390: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
33a0: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
33b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
33c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
33d0: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
33e0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
33f0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
3400: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
3410: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
3420: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
3430: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
3440: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
3450: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
3460: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
3470: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
3480: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
3490: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
34a0: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
34b0: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
34c0: 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61  UIRESEEK..*/.sta
34d0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
34e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
34f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
3500: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3510: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
3520: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
3530: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
3540: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
3550: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
3560: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
3570: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
3580: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
3590: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20  &pCur->nKey);.. 
35a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
35b0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
35c0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
35d0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
35e0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
35f0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
3600: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
3610: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
3620: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
3630: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
3640: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
3650: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
3660: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
3670: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
3680: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
3690: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
36a0: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
36b0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
36c0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
36d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36e0: 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61  && 0==pCur->apPa
36f0: 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a  ge[0]->intKey){.
3700: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
3710: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
3720: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20  (int)pCur->nKey 
3730: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
3740: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
3750: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
3760: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
3770: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
3780: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
3790: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37a0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
37b0: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
37c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37d0: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
37e0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
37f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
3800: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
3810: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
3820: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
3830: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
3840: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
3850: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3860: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3870: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
3880: 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
3890: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
38a0: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
38b0: 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
38c0: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
38d0: 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
38e0: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43  age = -1;.    pC
38f0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
3900: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
3910: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
3920: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3930: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
3940: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
3950: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
3960: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
3970: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
3980: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
3990: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
39a0: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
39b0: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
39c0: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
39d0: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
39e0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
39f0: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
3a00: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
3a10: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
3a20: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
3a30: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
3a40: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
3a50: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
3a60: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
3a70: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3a80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3a90: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3aa0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3ab0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
3ac0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
3ad0: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
3ae0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
3af0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3b00: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
3b10: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
3b20: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26  noRoot==iRoot) &
3b30: 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  & .        p->eS
3b40: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
3b50: 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID ){.      int 
3b60: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
3b70: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
3b80: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
3b90: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =rc ){.        r
3ba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
3bb0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
3be0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
3bf0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
3c00: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
3c10: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
3c20: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
3c30: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
3c40: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
3c50: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3c60: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
3c70: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
3c80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
3c90: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
3ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
3cb0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
3cc0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
3cd0: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
3ce0: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
3cf0: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
3d00: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
3d10: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
3d20: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
3d30: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
3d40: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
3d50: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
3d60: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
3d70: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
3d80: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
3d90: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
3da0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3db0: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
3dc0: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
3dd0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
3de0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
3df0: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
3e00: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
3e10: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
3e20: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
3e30: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
3e40: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
3e50: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
3e60: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
3e70: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
3e80: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
3e90: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
3ea0: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
3eb0: 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61    }.  pCur->eSta
3ec0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
3ed0: 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  LID;.  rc = sqli
3ee0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
3ef0: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
3f00: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
3f10: 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20  &pCur->skip);.  
3f20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3f30: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
3f40: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
3f50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
3f60: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
3f70: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
3f80: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
3f90: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
3fa0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
3fb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3fc0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
3fd0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3fe0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
3ff0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
4000: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
4010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
4020: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
4030: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
4040: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
4050: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
4060: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
4070: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
4080: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
4090: 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61  osition it.** wa
40a0: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74  s last placed at
40b0: 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  .  Cursors can m
40c0: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
40d0: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
40e0: 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65  ng.** at is dele
40f0: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
4100: 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er them..**.** T
4110: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
4120: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rns an error cod
4130: 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  e if something g
4140: 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a  oes wrong.  The.
4150: 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73  ** integer *pHas
4160: 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
4170: 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  one if the curso
4180: 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20  r has moved and 
4190: 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74  0 if not..*/.int
41a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
41b0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
41c0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
41d0: 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69  *pHasMoved){.  i
41e0: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  nt rc;..  rc = r
41f0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
4200: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
4210: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61  ( rc ){.    *pHa
4220: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  sMoved = 1;.    
4230: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
4240: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
4250: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
4260: 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30  || pCur->skip!=0
4270: 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76   ){.    *pHasMov
4280: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
4290: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
42a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
42b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
42c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
42d0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
42e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67  *.** Given a pag
42f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65  e number of a re
4300: 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70  gular database p
4310: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
4320: 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
4330: 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  or the pointer-m
4340: 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  ap page that con
4350: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
4360: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74  for the.** input
4370: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f   page number..*/
4380: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
4390: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
43a0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
43b0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
43c0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
43d0: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
43e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
43f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4400: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4410: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
4420: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
4430: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
4440: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
4450: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
4460: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
4470: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
4480: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
4490: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
44a0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
44b0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
44c0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
44d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
44e0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
44f0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
4500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
4510: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
4520: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
4530: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
4540: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
4550: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
4560: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
4570: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
4580: 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  '..** An error c
4590: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
45a0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
45b0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
45c0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
45d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
45e0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
45f0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
4600: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
4610: 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20  rent){.  DbPage 
4620: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
4630: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
4640: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
4650: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
4660: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
4670: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
4680: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
4690: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
46a0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
46b0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
46c0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
46d0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
46e0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
46f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
4700: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
4710: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
4720: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
4730: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
4740: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
4750: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
4760: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
4770: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
4780: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
4790: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
47a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
47b0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
47c0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
47d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
47e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
47f0: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
4800: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
4810: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
4820: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
4830: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
4840: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
4850: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4860: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
4870: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
4880: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
4890: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
48a0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
48b0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75  et<0 ){.    retu
48c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
48d0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  T_BKPT;.  }.  pP
48e0: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
48f0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
4900: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
4910: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
4920: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
4930: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
4940: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
4950: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
4960: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
4970: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
4980: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
4990: 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nt));.    rc = s
49a0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
49b0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
49c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
49d0: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
49e0: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
49f0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
4a00: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
4a10: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
4a20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
4a30: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
4a40: 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  bPage);.  return
4a50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
4a60: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
4a70: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
4a80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4a90: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
4aa0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
4ab0: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
4ac0: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
4ad0: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
4ae0: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
4af0: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
4b00: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
4b10: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
4b20: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
4b30: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
4b40: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
4b50: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
4b60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
4b70: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
4b80: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
4b90: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
4ba0: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
4bb0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
4bc0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
4bd0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
4be0: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
4bf0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
4c00: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
4c10: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
4c20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
4c30: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
4c40: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
4c50: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
4c60: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
4c70: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
4c80: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
4c90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4ca0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
4cb0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
4cc0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
4cd0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
4ce0: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
4cf0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
4d00: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
4d10: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
4d20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
4d30: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
4d40: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
4d50: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
4d60: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
4d70: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
4d80: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65  ap, key);.  asse
4d90: 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b  rt( pEType!=0 );
4da0: 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74  .  *pEType = pPt
4db0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  rmap[offset];.  
4dc0: 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67  if( pPgno ) *pPg
4dd0: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
4de0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
4df0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
4e00: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
4e10: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
4e20: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
4e30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
4e40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72  ORRUPT_BKPT;.  r
4e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4e60: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
4e70: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
4e80: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
4e90: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
4ea0: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apPut(w,x,y,z) S
4eb0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
4ec0: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
4ed0: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
4ee0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
4ef0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
4f00: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
4f10: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
4f20: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
4f30: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
4f40: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
4f50: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
4f60: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
4f70: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
4f80: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
4f90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
4fa0: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
4fb0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
4fc0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
4fd0: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
4fe0: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
4ff0: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
5000: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
5010: 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d  & get2byte(&(P)-
5020: 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c  >aData[(P)->cell
5030: 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29  Offset+2*(I)])))
5040: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
5050: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
5060: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
5070: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
5080: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
5090: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
50a0: 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69  ow cells.  See i
50b0: 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20  nsert.*/.static 
50c0: 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77  u8 *findOverflow
50d0: 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
50e0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
50f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
5100: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5110: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
5120: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
5130: 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65  or(i=pPage->nOve
5140: 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69  rflow-1; i>=0; i
5150: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  --){.    int k;.
5160: 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c      struct _Ovfl
5170: 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Cell *pOvfl;.   
5180: 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d   pOvfl = &pPage-
5190: 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b  >aOvfl[i];.    k
51a0: 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20   = pOvfl->idx;. 
51b0: 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20     if( k<=iCell 
51c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  ){.      if( k==
51d0: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  iCell ){.       
51e0: 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70   return pOvfl->p
51f0: 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cell;.      }.  
5200: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
5210: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5220: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
5230: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
5240: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
5250: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
5260: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
5270: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
5280: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
5290: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
52a0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71  is function.  sq
52b0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
52c0: 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a  ell() takes a .*
52d0: 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20  * cell index as 
52e0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
52f0: 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42  ent and sqlite3B
5300: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
5310: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
5320: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
5330: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
5340: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
5350: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
5360: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
5370: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
5380: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
5390: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
53a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
53b0: 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69  seCellPtr(). Usi
53c0: 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72  ng some compiler
53d0: 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
53e0: 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  faster..*/.void 
53f0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
5400: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
5410: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
5420: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
5430: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
5440: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5460: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
5470: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
5480: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
5490: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
54a0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
54b0: 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20   */.){.  u16 n; 
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73   /* Number bytes
54e0: 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   in cell content
54f0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
5500: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
5510: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5520: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
5530: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73  payload */..  as
5540: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
5550: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
5560: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
5570: 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d    pInfo->pCell =
5580: 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74   pCell;.  assert
5590: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
55a0: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
55b0: 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67  =1 );.  n = pPag
55c0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
55d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d  .  assert( n==4-
55e0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
55f0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
5600: 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20  tKey ){.    if( 
5610: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
5620: 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74  {.      n += get
5630: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
5640: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
5650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5660: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
5670: 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74    }.    n += get
5680: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d  Varint(&pCell[n]
5690: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
56a0: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f  nKey);.    pInfo
56b0: 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f  ->nData = nPaylo
56c0: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
56d0: 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20   pInfo->nData = 
56e0: 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  0;.    n += getV
56f0: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
5700: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
5710: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
5720: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20  nPayload;.  }.  
5730: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
5740: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
5750: 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e  nfo->nHeader = n
5760: 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e  ;.  if( likely(n
5770: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
5780: 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  maxLocal) ){.   
5790: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
57a0: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
57b0: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
57c0: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
57d0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
57e0: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
57f0: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
5800: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
5810: 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  int nSize;      
5820: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
5830: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
5840: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  t in bytes */.  
5850: 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f    nSize = nPaylo
5860: 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66  ad + n;.    pInf
5870: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
5880: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70  )nPayload;.    p
5890: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
58a0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53  = 0;.    if( (nS
58b0: 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a  ize & ~3)==0 ){.
58c0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b        nSize = 4;
58d0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
58e0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
58f0: 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70  4 */.    }.    p
5900: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75  Info->nSize = (u
5910: 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73  16)nSize;.  }els
5920: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
5930: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
5940: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
5950: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
5960: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20  ge, we have.    
5970: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
5980: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
5990: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
59a0: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
59b0: 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  o.    ** overflo
59c0: 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74  w pages.  The st
59d0: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e  rategy is to min
59e0: 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74  imize the amount
59f0: 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a   of unused.    *
5a00: 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66  * space on overf
5a10: 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20  low pages while 
5a20: 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75  keeping the amou
5a30: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72  nt of local stor
5a40: 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65  age.    ** in be
5a50: 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61  tween minLocal a
5a60: 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20  nd maxLocal..   
5a70: 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69   **.    ** Warni
5a80: 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68  ng:  changing th
5a90: 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70  e way overflow p
5aa0: 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69  ayload is distri
5ab0: 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20  buted in any.   
5ac0: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
5ad0: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
5ae0: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
5af0: 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  at..    */.    i
5b00: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
5b10: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
5b20: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
5b30: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69  locally */.    i
5b40: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a  nt maxLocal;  /*
5b50: 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Maximum amount 
5b60: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
5b70: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69  locally */.    i
5b80: 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a  nt surplus;   /*
5b90: 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   Overflow payloa
5ba0: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
5bb0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f  local storage */
5bc0: 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d  ..    minLocal =
5bd0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
5be0: 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  ;.    maxLocal =
5bf0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
5c00: 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20  ;.    surplus = 
5c10: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79  minLocal + (nPay
5c20: 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  load - minLocal)
5c30: 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  %(pPage->pBt->us
5c40: 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
5c50: 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c     if( surplus <
5c60: 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  = maxLocal ){.  
5c70: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
5c80: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
5c90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5ca0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
5cb0: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
5cc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66  ;.    }.    pInf
5cd0: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  o->iOverflow = (
5ce0: 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  u16)(pInfo->nLoc
5cf0: 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e  al + n);.    pIn
5d00: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66  fo->nSize = pInf
5d10: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34  o->iOverflow + 4
5d20: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
5d30: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
5d40: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c   iCell, pInfo) \
5d50: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
5d60: 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61  arseCellPtr((pPa
5d70: 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70  ge), findCell((p
5d80: 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c  Page), (iCell)),
5d90: 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73   (pInfo)).void s
5da0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
5db0: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
5dc0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
5dd0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
5de0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
5df0: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
5e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5e10: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
5e20: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
5e30: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
5e40: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
5e50: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
5e60: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73  ure */.){.  pars
5e70: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
5e80: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  ll, pInfo);.}../
5e90: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
5ea0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
5eb0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
5ec0: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
5ed0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
5ee0: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
5ef0: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
5f00: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
5f10: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
5f20: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
5f30: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
5f40: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
5f50: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
5f60: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
5f70: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
5f80: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  er..*/.static u1
5f90: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
5fa0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
5fb0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
5fc0: 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70  pIter = &pCell[p
5fd0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
5fe0: 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65  ze];.  u32 nSize
5ff0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
6000: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
6010: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
6020: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
6030: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
6040: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
6050: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
6060: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
6070: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
6080: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
6090: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
60a0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
60b0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
60c0: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
60d0: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
60e0: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
60f0: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
6100: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
6110: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
6120: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
6130: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
6140: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
6150: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
6160: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
6170: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
6180: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b  ){.    u8 *pEnd;
6190: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
61a0: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
61b0: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
61c0: 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69  int32(pIter, nSi
61d0: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
61e0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b        nSize = 0;
61f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70  .    }..    /* p
6200: 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20  Iter now points 
6210: 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  at the 64-bit in
6220: 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c  teger key value,
6230: 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
6240: 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  th .    ** integ
6250: 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
6260: 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49  g block moves pI
6270: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
6280: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
6290: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
62a0: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61  nd of the key va
62b0: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64  lue. */.    pEnd
62c0: 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20   = &pIter[9];.  
62d0: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
62e0: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
62f0: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73  r<pEnd );.  }els
6300: 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20  e{.    pIter += 
6310: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
6320: 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  r, nSize);.  }..
6330: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
6340: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
6350: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20     int minLocal 
6360: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
6370: 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  l;.    nSize = m
6380: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65  inLocal + (nSize
6390: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28   - minLocal) % (
63a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
63b0: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
63c0: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
63d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
63e0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
63f0: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
6400: 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a  nSize += 4;.  }.
6410: 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29    nSize += (u32)
6420: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
6430: 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d  ..  /* The minim
6440: 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63  um size of any c
6450: 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20  ell is 4 bytes. 
6460: 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  */.  if( nSize<4
6470: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   ){.    nSize = 
6480: 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  4;.  }..  assert
6490: 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e  ( nSize==debugin
64a0: 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65  fo.nSize );.  re
64b0: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
64c0: 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  .}.#ifndef NDEBU
64d0: 47 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  G.static u16 cel
64e0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
64f0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
6500: 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c 53  {.  return cellS
6510: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66 69  izePtr(pPage, fi
6520: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
6530: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
6540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6550: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
6560: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
6570: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
6580: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
6590: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
65a0: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
65b0: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
65c0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
65d0: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
65e0: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
65f0: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
6600: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66  int ptrmapPutOvf
6610: 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  lPtr(MemPage *pP
6620: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
6630: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
6640: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
6650: 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l!=0 );.  sqlite
6660: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
6670: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
6680: 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
6690: 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  t( (info.nData+(
66a0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
66b0: 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66  info.nKey))==inf
66c0: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
66d0: 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
66e0: 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  ow ){.    Pgno o
66f0: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
6700: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
6710: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75  flow]);.    retu
6720: 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61  rn ptrmapPut(pPa
6730: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
6740: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
6750: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
6760: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
6770: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
6780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
6790: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
67a0: 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72  n.  All Cells ar
67b0: 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
67c0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  * end of the pag
67d0: 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73  e and all free s
67e0: 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65  pace is collecte
67f0: 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69  d into one.** bi
6800: 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f  g FreeBlk that o
6810: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
6820: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
6830: 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  cell.** pointer 
6840: 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65  array and the ce
6850: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
6860: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6870: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
6880: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
6890: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
68b0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
68c0: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
68e0: 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68  ddress of a i-th
68f0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61   cell */.  int a
6900: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
6910: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6920: 6f 66 20 66 69 72 73 74 20 62 79 74 65 20 61 66  of first byte af
6930: 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ter cell pointer
6940: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
6950: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
6960: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
6970: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
6980: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
6990: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
69a0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
69b0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
69c0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
69d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
69e0: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
69f0: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
6a00: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
6a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
6a20: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
6a30: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
6a40: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a60: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
6a70: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
6a80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
6ab0: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
6ac0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
6ad0: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
6ae0: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
6af0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
6b00: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
6b10: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
6b20: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
6b30: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
6b40: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
6b50: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
6b60: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
6b70: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
6b80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6b90: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
6ba0: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
6bb0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
6bc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6bd0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
6be0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6bf0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6c00: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6c10: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
6c20: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
6c30: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
6c40: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
6c50: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
6c60: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
6c70: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
6c80: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
6c90: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
6ca0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
6cb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
6cc0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
6cd0: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
6ce0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
6cf0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6d00: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
6d10: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
6d20: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
6d30: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
6d40: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
6d50: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
6d60: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
6d70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
6d80: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
6d90: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
6da0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
6db0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
6dc0: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
6dd0: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
6de0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
6df0: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 69 66 28  (pAddr);.    if(
6e00: 20 70 63 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20   pc>=usableSize 
6e10: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6e20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6e30: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  KPT;.    }.    s
6e40: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
6e50: 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70  r(pPage, &temp[p
6e60: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
6e70: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
6e80: 62 72 6b 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32  brk<cellOffset+2
6e90: 2a 6e 43 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a  *nCell || pc+siz
6ea0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
6eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6ec0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
6ee0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
6ef0: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
6f00: 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63  k>=0 );.    memc
6f10: 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  py(&data[cbrk], 
6f20: 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29  &temp[pc], size)
6f30: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
6f40: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d  Addr, cbrk);.  }
6f50: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
6f60: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
6f70: 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ell );.  put2byt
6f80: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
6f90: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
6fa0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
6fb0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
6fc0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
6fd0: 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66    addr = cellOff
6fe0: 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d  set+2*nCell;.  m
6ff0: 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72  emset(&data[addr
7000: 5d 2c 20 30 2c 20 63 62 72 6b 2d 61 64 64 72 29  ], 0, cbrk-addr)
7010: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7020: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
7030: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
7040: 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72  ge) );.  if( cbr
7050: 6b 2d 61 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e  k-addr!=pPage->n
7060: 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Free ){.    retu
7070: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7080: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
7090: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
70a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
70b0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
70c0: 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68   space from with
70d0: 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61  in the B-Tree pa
70e0: 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  ge passed.** as 
70f0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
7100: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 69  nt. Return the i
7110: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
7120: 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20  >aData[] of the 
7130: 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65 20 6f  .** first byte o
7140: 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  f allocated spac
7150: 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  e. .**.** The ca
7160: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
7170: 74 68 61 74 20 74 68 65 20 73 70 61 63 65 20 62  that the space b
7180: 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
7190: 66 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73 65  f the cell-offse
71a0: 74 20 0a 2a 2a 20 61 72 72 61 79 20 61 6e 64 20  t .** array and 
71b0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
71c0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
71d0: 65 61 20 69 73 20 61 74 20 6c 65 61 73 74 20 6e  ea is at least n
71e0: 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 69 6e  Byte bytes.** in
71f0: 20 73 69 7a 65 2e 20 53 6f 20 74 68 69 73 20 72   size. So this r
7200: 6f 75 74 69 6e 65 20 63 61 6e 20 6e 65 76 65 72  outine can never
7210: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   fail..**.** If 
7220: 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
7230: 79 20 36 30 20 6f 72 20 6d 6f 72 65 20 62 79 74  y 60 or more byt
7240: 65 73 20 6f 66 20 66 72 61 67 6d 65 6e 74 73 20  es of fragments 
7250: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c  within the page,
7260: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20  .** the page is 
7270: 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66  defragmented bef
7280: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49  ore returning. I
7290: 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20  f this were not 
72a0: 64 6f 6e 65 20 74 68 65 72 65 0a 2a 2a 20 69 73  done there.** is
72b0: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
72c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
72d0: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 63 6f  gmented bytes co
72e0: 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  uld eventually .
72f0: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 74 68 65 20  ** overflow the 
7300: 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 65 6c  single-byte fiel
7310: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2d 68 65  d of the page-he
7320: 61 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  ader in which th
7330: 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  is value.** is s
7340: 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tored..*/.static
7350: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
7360: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
7370: 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  e, int nByte){. 
7380: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
7390: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
73a0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
73b0: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
73c0: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
73d0: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
73e0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
73f0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
7400: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
7410: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67  a */.  int nFrag
7420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7440: 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e  umber of fragmen
7450: 74 65 64 20 62 79 74 65 73 20 6f 6e 20 70 50 61  ted bytes on pPa
7460: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  ge */.  int top;
7470: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
7480: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
7490: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
74a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
74b0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
74c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
74d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
74e0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
74f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
7500: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
7510: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
7520: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
7530: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
7540: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
7550: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
7560: 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  low==0 );..  /* 
7570: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
7580: 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 74 68  space between th
7590: 65 20 63 65 6c 6c 2d 6f 66 66 73 65 74 20 61 72  e cell-offset ar
75a0: 72 61 79 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ray and the .  *
75b0: 2a 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  * cell-content a
75c0: 72 65 61 20 69 73 20 67 72 65 61 74 65 72 20 74  rea is greater t
75d0: 68 61 6e 20 6e 42 79 74 65 20 62 79 74 65 73 2e  han nByte bytes.
75e0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
75f0: 6e 42 79 74 65 20 3c 3d 20 28 0a 20 20 20 20 20  nByte <= (.     
7600: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7610: 68 64 72 2b 35 5d 29 2d 28 68 64 72 2b 38 2b 28  hdr+5])-(hdr+8+(
7620: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
7630: 2b 32 2a 67 65 74 32 62 79 74 65 28 26 64 61 74  +2*get2byte(&dat
7640: 61 5b 68 64 72 2b 33 5d 29 29 0a 20 20 29 29 3b  a[hdr+3])).  ));
7650: 0a 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ..  pPage->nFree
7660: 20 2d 3d 20 28 75 31 36 29 6e 42 79 74 65 3b 0a   -= (u16)nByte;.
7670: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
7680: 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72  dr+7];.  if( nFr
7690: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 64 65  ag>=60 ){.    de
76a0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
76b0: 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
76c0: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
76d0: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
76e0: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
76f0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
7700: 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74  atisfy .    ** t
7710: 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20  he request. The 
7720: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61  allocation is ma
7730: 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  de from the firs
7740: 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a  t free slot in .
7750: 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20      ** the list 
7760: 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e  that is large en
7770: 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61  ough to accomada
7780: 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  te it..    */.  
7790: 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a    int pc, addr;.
77a0: 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72      for(addr=hdr
77b0: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
77c0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
77d0: 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20  >0; addr=pc){.  
77e0: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67      int size = g
77f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
7800: 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20 53 69 7a  +2]);     /* Siz
7810: 65 20 6f 66 20 66 72 65 65 20 73 6c 6f 74 20 2a  e of free slot *
7820: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  /.      if( size
7830: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
7840: 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20     int x = size 
7850: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
7860: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
7870: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
7880: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
7890: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
78a0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
78b0: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
78c0: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
78d0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
78e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
78f0: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
7900: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
7910: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
7920: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
7930: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
7940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7950: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
7960: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
7970: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
7980: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
7990: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unt.          **
79a0: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
79b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
79c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
79d0: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
79e0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
79f0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
7a00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20        return pc 
7a10: 2b 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  + x;.      }.   
7a20: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
7a30: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
7a40: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
7a50: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
7a60: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
7a70: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
7a80: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f  ntent area..  */
7a90: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
7aa0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
7ab0: 2d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  - nByte;.  put2b
7ac0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
7ad0: 2c 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e  , top);.  return
7ae0: 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   top;.}../*.** R
7af0: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
7b00: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
7b10: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
7b20: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
7b30: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
7b40: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
7b50: 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61  pPage->aDisk[sta
7b60: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
7b70: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
7b80: 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73   is "size" bytes
7b90: 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20  ..**.** Most of 
7ba0: 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20  the effort here 
7bb0: 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63  is involved in c
7bc0: 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e  oalesing adjacen
7bd0: 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73  t.** free blocks
7be0: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62   into a single b
7bf0: 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a  ig free block..*
7c00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
7c10: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
7c20: 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74  pPage, int start
7c30: 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69  , int size){.  i
7c40: 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c  nt addr, pbegin,
7c50: 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64   hdr;.  unsigned
7c60: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
7c70: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61  age->aData;..  a
7c80: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
7c90: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
7ca0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
7cb0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
7cc0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
7cd0: 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50  ssert( start>=pP
7ce0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
7cf0: 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a  +(pPage->leaf?0:
7d00: 34 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  4) );.  assert( 
7d10: 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d  (start + size)<=
7d20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
7d30: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
7d40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7d50: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
7d60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
7d70: 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29  ssert( size>=0 )
7d80: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
7d90: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
7da0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7db0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
7dc0: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
7dd0: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
7de0: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
7df0: 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45   the SECURE_DELE
7e00: 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  TE .  ** option 
7e10: 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  is enabled at co
7e20: 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20  mpile-time */.  
7e30: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61  memset(&data[sta
7e40: 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23  rt], 0, size);.#
7e50: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
7e60: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
7e70: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
7e80: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
7e90: 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61  s */.  hdr = pPa
7ea0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
7eb0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
7ec0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
7ed0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
7ee0: 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74  ta[addr]))<start
7ef0: 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a   && pbegin>0 ){.
7f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
7f10: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
7f20: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
7f30: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 3d      if( pbegin<=
7f40: 61 64 64 72 20 29 20 7b 0a 20 20 20 20 20 20 72  addr ) {.      r
7f50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7f60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
7f70: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67  .    addr = pbeg
7f80: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 20 28 20 70  in;.  }.  if ( p
7f90: 62 65 67 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74  begin>pPage->pBt
7fa0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
7fb0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
7fc0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7fd0: 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
7fe0: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20   pbegin>addr || 
7ff0: 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70  pbegin==0 );.  p
8000: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  ut2byte(&data[ad
8010: 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70  dr], start);.  p
8020: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
8030: 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20  art], pbegin);. 
8040: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
8050: 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b  start+2], size);
8060: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
8070: 2b 3d 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20  += (u16)size;.. 
8080: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
8090: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
80a0: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50  s */.  addr = pP
80b0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b  age->hdrOffset +
80c0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
80d0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
80e0: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
80f0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
8100: 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20  , psize, x;.    
8110: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
8120: 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ddr );.    asser
8130: 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65  t( pbegin<=pPage
8140: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8150: 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74  e-4 );.    pnext
8160: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8170: 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20  a[pbegin]);.    
8180: 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  psize = get2byte
8190: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
81a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  );.    if( pbegi
81b0: 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d  n + psize + 3 >=
81c0: 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e   pnext && pnext>
81d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  0 ){.      int f
81e0: 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70  rag = pnext - (p
81f0: 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20  begin+psize);.  
8200: 20 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29      if( (frag<0)
8210: 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64   || (frag>(int)d
8220: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
8230: 66 73 65 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20  fset+7]) ){.    
8240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8250: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
8270: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
8280: 73 65 74 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72  set+7] -= (u8)fr
8290: 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  ag;.      x = ge
82a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
82b0: 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32  xt]);.      put2
82c0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
82d0: 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20  n], x);.      x 
82e0: 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79  = pnext + get2by
82f0: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32  te(&data[pnext+2
8300: 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20  ]) - pbegin;.   
8310: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
8320: 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b  a[pbegin+2], x);
8330: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8340: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
8350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8360: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
8370: 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73  tent area begins
8380: 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63   with a freebloc
8390: 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  k, remove it. */
83a0: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
83b0: 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20  1]==data[hdr+5] 
83c0: 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d  && data[hdr+2]==
83d0: 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20  data[hdr+6] ){. 
83e0: 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20     int top;.    
83f0: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
8400: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
8410: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
8420: 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b  a[hdr+1], &data[
8430: 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20  pbegin], 2);.   
8440: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
8450: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20  &data[hdr+5]) + 
8460: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
8470: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70  begin+2]);.    p
8480: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
8490: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a  r+5], top);.  }.
84a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
84b0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
84c0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
84d0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
84e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
84f0: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
8500: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
8510: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
8520: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
8530: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
8540: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
8550: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
8560: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
8570: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
8580: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
8590: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
85a0: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
85b0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
85c0: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
85d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
85e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
85f0: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
8600: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
8610: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
8620: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
8630: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
8640: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
8650: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
8660: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
8670: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
8680: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
8690: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
86a0: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
86b0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
86c0: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
86d0: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
86e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
86f0: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
8700: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
8710: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
8720: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8730: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
8740: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
8750: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
8760: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
8770: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
8780: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
8790: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
87a0: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
87b0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
87c0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
87d0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
87e0: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
87f0: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
8800: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
8810: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
8820: 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  y = 1;.    pPage
8830: 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61 67  ->hasData = pPag
8840: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61  e->leaf;.    pPa
8850: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
8860: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
8870: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
8880: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
8890: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
88a0: 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
88b0: 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ATA ){.    pPage
88c0: 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
88d0: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
88e0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
88f0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
8900: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70  >maxLocal;.    p
8910: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
8920: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a   pBt->minLocal;.
8930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
8940: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8950: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
8960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
8980: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
8990: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
89a0: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
89b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
89c0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
89d0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
89e0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
89f0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
8a00: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
8a10: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
8a20: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
8a30: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
8a40: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
8a50: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
8a60: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
8a70: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
8a80: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
8a90: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
8aa0: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
8ab0: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
8ac0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
8ad0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
8ae0: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
8af0: 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73  e *pPage){..  as
8b00: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8b10: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8b20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8b30: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8b40: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
8b50: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
8b60: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
8b70: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
8b80: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8b90: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
8ba0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8bb0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
8bc0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
8bd0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
8be0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
8bf0: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
8c00: 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ge) );..  if( !p
8c10: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
8c20: 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20      u16 pc;     
8c30: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8c40: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
8c50: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
8c60: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38  Data[] */.    u8
8c70: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
8c80: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
8c90: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
8ca0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38  header */.    u8
8cb0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
8cc0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
8cd0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20  ge->aData */.   
8ce0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
8cf0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
8d00: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
8d10: 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75 73  re */.    u16 us
8d20: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  ableSize;    /* 
8d30: 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65  Amount of usable
8d40: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
8d50: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63  age */.    u16 c
8d60: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
8d70: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
8d80: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
8d90: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
8da0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72 65   */.    u16 nFre
8db0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
8dc0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
8dd0: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
8de0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70 3b   */.    u16 top;
8df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8e00: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
8e10: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
8e20: 61 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  a */..    pBt = 
8e30: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
8e40: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
8e50: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
8e60: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
8e70: 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  ;.    if( decode
8e80: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
8e90: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
8ea0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8eb0: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
8ec0: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
8ed0: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
8ee0: 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a  eSize<=32768 );.
8ef0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
8f00: 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  age = pBt->pageS
8f10: 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61  ize - 1;.    pPa
8f20: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
8f30: 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  0;.    usableSiz
8f40: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
8f50: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ize;.    pPage->
8f60: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
8f70: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
8f80: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
8f90: 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  af;.    top = ge
8fa0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8fb0: 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  +5]);.    pPage-
8fc0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
8fd0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
8fe0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
8ff0: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
9000: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
9010: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
9020: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
9030: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
9040: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
9050: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9060: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9070: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 6d     }..    /* A m
9080: 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
9090: 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
90a0: 73 65 20 75 73 65 20 74 6f 20 72 65 61 64 20 70  se use to read p
90b0: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
90c0: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
90d0: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
90e0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
90f0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
9100: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
9110: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
9120: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
9130: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
9140: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
9150: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
9160: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
9170: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
9180: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
9190: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  does..    */.#if
91a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
91b0: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
91c0: 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20  CELL_CHECK).    
91d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 65 6c  {.      int iCel
91e0: 6c 46 69 72 73 74 3b 20 20 20 2f 2a 20 46 69 72  lFirst;   /* Fir
91f0: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
9200: 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
9210: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
9220: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
9230: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
9240: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
9250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9260: 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c  ex into the cell
9270: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
9280: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20  /.      int sz; 
9290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
92a0: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a  e of a cell */..
92b0: 20 20 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74        iCellFirst
92c0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
92d0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
92e0: 20 20 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20        iCellLast 
92f0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
9300: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
9310: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
9320: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
9330: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
9340: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
9350: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
9360: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
9370: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
9380: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
9390: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
93a0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
93b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
93c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
93d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
93e0: 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
93f0: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
9400: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
9410: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
9420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
9430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9440: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
9450: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9460: 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  }  .#endif..    
9470: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
9480: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
9490: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
94a0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
94b0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
94c0: 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
94d0: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20  [hdr+7] + top;. 
94e0: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
94f0: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
9500: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
9510: 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d  ( pc>usableSize-
9520: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
9530: 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66  Free block is of
9540: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
9550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9560: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9570: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
9580: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
9590: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
95a0: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
95b0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
95c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e  .      if( next>
95d0: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
95e0: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20 20  ze+3 ){.        
95f0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d  /* Free blocks m
9600: 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64  ust be in accend
9610: 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
9620: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9630: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9640: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
9650: 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20  nFree = nFree + 
9660: 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d  size;.      pc =
9670: 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20   next;.    }..  
9680: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
9690: 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
96a0: 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
96b0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
96c0: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20  start.    ** of 
96d0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
96e0: 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e   area plus the n
96f0: 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79  umber of free by
9700: 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a  tes within.    *
9710: 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  * the cell-conte
9720: 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73  nt area. If this
9730: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
9740: 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65   the usable-size
9750: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
9760: 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
9770: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
9780: 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
9790: 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72   also.    ** ser
97a0: 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
97b0: 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
97c0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
97d0: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
97e0: 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f     ** area, acco
97f0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  rding to the pag
9800: 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77  e header, lies w
9810: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a  ithin the page..
9820: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
9830: 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
9840: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9850: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9860: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
9870: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e  pPage->nFree = n
9880: 46 72 65 65 20 2d 20 28 63 65 6c 6c 4f 66 66 73  Free - (cellOffs
9890: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
98a0: 65 6c 6c 29 3b 0a 0a 23 69 66 20 30 0a 20 20 2f  ell);..#if 0.  /
98b0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c 6c  * Check that all
98c0: 20 74 68 65 20 6f 66 66 73 65 74 73 20 69 6e 20   the offsets in 
98d0: 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65 74 20  the cell offset 
98e0: 61 72 72 61 79 20 61 72 65 20 77 69 74 68 69 6e  array are within
98f0: 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a 20   range. .  ** . 
9900: 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20 74 68 69   ** Omitting thi
9910: 73 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 63 68  s consistency ch
9920: 65 63 6b 20 61 6e 64 20 75 73 69 6e 67 20 74 68  eck and using th
9930: 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  e pPage->maskPag
9940: 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74 6f 20 70  e mask.  ** to p
9950: 72 65 76 65 6e 74 20 6f 76 65 72 72 75 6e 6e 69  revent overrunni
9960: 6e 67 20 74 68 65 20 70 61 67 65 20 62 75 66 66  ng the page buff
9970: 65 72 20 69 6e 20 66 69 6e 64 43 65 6c 6c 28 29  er in findCell()
9980: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 0a 20 20   results in a.  
9990: 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f 72 6d 61  ** 2.5% performa
99a0: 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20  nce gain..  */. 
99b0: 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f 66 66 3b   {.    u8 *pOff;
99c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
99d0: 74 6f 72 20 75 73 65 64 20 74 6f 20 63 68 65 63  tor used to chec
99e0: 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65  k all cell offse
99f0: 74 73 20 61 72 65 20 69 6e 20 72 61 6e 67 65 20  ts are in range 
9a00: 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b  */.    u8 *pEnd;
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9a20: 65 72 20 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c  er to end of cel
9a30: 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 2a  l offset array *
9a40: 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b 3b 20 20  /.    u8 mask;  
9a50: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
9a60: 66 20 62 69 74 73 20 74 68 61 74 20 6d 75 73 74  f bits that must
9a70: 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20   be zero in MSB 
9a80: 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20  of cell offsets 
9a90: 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20 7e 28  */.    mask = ~(
9aa0: 28 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53  ((u8)(pBt->pageS
9ab0: 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 20  ize>>8))-1);.   
9ac0: 20 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65   pEnd = &data[ce
9ad0: 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50 61 67 65  llOffset + pPage
9ae0: 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20  ->nCell*2];.    
9af0: 66 6f 72 28 70 4f 66 66 3d 26 64 61 74 61 5b 63  for(pOff=&data[c
9b00: 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66  ellOffset]; pOff
9b10: 21 3d 70 45 6e 64 20 26 26 20 21 28 28 2a 70 4f  !=pEnd && !((*pO
9b20: 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b  ff)&mask); pOff+
9b30: 3d 32 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 66  =2);.    if( pOf
9b40: 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  f!=pEnd ){.     
9b50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9b60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9b70: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
9b80: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
9b90: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
9ba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9bb0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
9bc0: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
9bd0: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
9be0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
9bf0: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
9c00: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
9c10: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
9c20: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9c30: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
9c40: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
9c50: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
9c60: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
9c70: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
9c80: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
9c90: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
9ca0: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
9cb0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
9cc0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
9cd0: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
9ce0: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
9cf0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9d00: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
9d10: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
9d20: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
9d30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9d40: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
9d50: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
9d60: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
9d70: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
9d80: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
9d90: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
9da0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9db0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
9dc0: 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74  x) );.  /*memset
9dd0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
9de0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
9df0: 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61  - hdr);*/.  data
9e00: 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
9e10: 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
9e20: 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61  dr + 8 + 4*((fla
9e30: 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20  gs&PTF_LEAF)==0 
9e40: 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ?1:0);.  memset(
9e50: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
9e60: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
9e70: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
9e80: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
9e90: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
9ea0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
9eb0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
9ec0: 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64  ize - first;.  d
9ed0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
9ee0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
9ef0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68  e->hdrOffset = h
9f00: 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  dr;.  pPage->cel
9f10: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
9f20: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
9f30: 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
9f40: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
9f50: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
9f60: 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b  geSize<=32768 );
9f70: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
9f80: 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ge = pBt->pageSi
9f90: 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d  ze - 1;.  pPage-
9fa0: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
9fb0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
9fc0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
9fd0: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
9fe0: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
9ff0: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
a000: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
a010: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
a020: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
a030: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
a040: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
a050: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
a060: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
a070: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
a080: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
a090: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
a0a0: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
a0b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
a0c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
a0d0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
a0e0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
a0f0: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
a100: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
a110: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
a120: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
a130: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
a140: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
a150: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
a160: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
a170: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
a180: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
a190: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
a1a0: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
a1b0: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
a1c0: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a   if needed..**.*
a1d0: 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65  * If the noConte
a1e0: 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nt flag is set, 
a1f0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
a200: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
a210: 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
a220: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
a230: 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
a240: 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
a250: 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
a260: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
a270: 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
a280: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
a290: 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
a2a0: 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
a2b0: 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
a2c0: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
a2d0: 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
a2e0: 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
a2f0: 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
a300: 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
a310: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
a320: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
a330: 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
a340: 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   point..*/.int s
a350: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
a360: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
a370: 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
a380: 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
a390: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
a3a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
a3b0: 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
a3c0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
a3d0: 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
a3e0: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
a3f0: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
a400: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
a410: 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  nt        /* Do 
a420: 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f  not load page co
a430: 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f  ntent if true */
a440: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a450: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
a460: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
a470: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a480: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a490: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
a4a0: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
a4b0: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
a4c0: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
a4d0: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
a4e0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a4f0: 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
a500: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
a510: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
a520: 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
a530: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a540: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
a550: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
a560: 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
a570: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
a580: 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
a590: 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
a5a0: 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
a5b0: 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
a5c0: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
a5d0: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
a5e0: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
a5f0: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
a600: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
a610: 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
a620: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
a630: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
a640: 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
a650: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a660: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
a670: 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
a680: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
a690: 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
a6a0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
a6b0: 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
a6c0: 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
a6d0: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
a6e0: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
a6f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
a700: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
a710: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
a720: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
a730: 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
a740: 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
a750: 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
a760: 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
a770: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
a780: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42 74  agerPagecount(Bt
a790: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
a7a0: 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b 0a  int nPage = -1;.
a7b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
a7c0: 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
a7d0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
a7e0: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
a7f0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
a800: 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
a810: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
a820: 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20 20   nPage==-1 );.  
a830: 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50 61  return (Pgno)nPa
a840: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ge;.}../*.** Get
a850: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
a860: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
a870: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
a880: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75  routine.** is ju
a890: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  st a convenience
a8a0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
a8b0: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
a8c0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
a8d0: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 73  eGetPage() and s
a8e0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
a8f0: 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
a900: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
a910: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
a920: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
a930: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
a940: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
a950: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
a960: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
a970: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
a980: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
a990: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
a9a0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
a9b0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
a9c0: 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
a9d0: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
a9e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a9f0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
aa00: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
aa10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
aa20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
aa30: 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PT; .  }..  /* I
aa40: 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63  t is often the c
aa50: 61 73 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ase that the pag
aa60: 65 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72  e we want is alr
aa70: 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20  eady in cache.. 
aa80: 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69   ** If so, get i
aa90: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
aaa0: 73 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20  s saves us from 
aab0: 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20  having to call. 
aac0: 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75   ** pagerPagecou
aad0: 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72  nt() to make sur
aae0: 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e  e pgno is within
aaf0: 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72   limits, which r
ab00: 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61  esults.  ** in a
ab10: 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65 72   measureable per
ab20: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
ab30: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a 70  ments..  */.  *p
ab40: 70 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20  pPage = pPage = 
ab50: 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
ab60: 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  pBt, pgno);.  if
ab70: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2f  ( pPage ){.    /
ab80: 2a 20 50 61 67 65 20 69 73 20 61 6c 72 65 61 64  * Page is alread
ab90: 79 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  y in cache */.  
aba0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
abb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
abc0: 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e 20 63 61  * Page not in ca
abd0: 63 68 65 2e 20 20 41 63 71 75 69 72 65 20 69 74  che.  Acquire it
abe0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
abf0: 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
ac00: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
ac10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ac20: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
ac30: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
ac40: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
ac50: 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
ac60: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
ac70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
ac80: 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61 67    pPage = *ppPag
ac90: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  e;.  }.  if( !pP
aca0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
acb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
acc0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
acd0: 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
ace0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
acf0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
ad00: 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70 50  pPage);.    *ppP
ad10: 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
ad20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ad30: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
ad40: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
ad50: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
ad60: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
ad70: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
ad80: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e  te3BtreeGetPage.
ad90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ada0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
adb0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
adc0: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
add0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
ade0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73  Overflow==0 || s
adf0: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
ae00: 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70  efcount(pPage->p
ae10: 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20 20  DbPage)>1 );.   
ae20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ae30: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
ae40: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
ae50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
ae60: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
ae70: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
ae80: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
ae90: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
aea0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
aeb0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
aec0: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
aed0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
aee0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
aef0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
af00: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
af10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
af20: 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
af30: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
af40: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
af50: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
af60: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
af70: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
af80: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
af90: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
afa0: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
afb0: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
afc0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
afd0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
afe0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
aff0: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
b000: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
b010: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b020: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
b030: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
b040: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
b050: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
b060: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
b070: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
b080: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
b090: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
b0a0: 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
b0b0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
b0c0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
b0d0: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
b0e0: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
b0f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b100: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
b110: 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
b120: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
b130: 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
b140: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b150: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b160: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
b170: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
b180: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
b190: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
b1a0: 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
b1b0: 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
b1c0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
b1d0: 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
b1e0: 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
b1f0: 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
b200: 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
b210: 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
b220: 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
b230: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
b240: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
b250: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
b260: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
b270: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
b280: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
b290: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
b2a0: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
b2b0: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
b2c0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
b2d0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
b2e0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
b2f0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
b300: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
b310: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
b320: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
b330: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
b340: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
b350: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
b360: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
b370: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
b380: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b390: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
b3a0: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
b3b0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
b3c0: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
b3d0: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
b3e0: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
b3f0: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
b400: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
b410: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
b420: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b430: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
b440: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
b450: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b460: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
b470: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
b480: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
b490: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
b4a0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
b4b0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
b4c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
b4d0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
b4e0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
b4f0: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
b500: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
b510: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
b520: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
b530: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
b540: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
b550: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
b560: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
b570: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
b580: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
b590: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
b5a0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
b5b0: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
b5c0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
b5d0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
b5e0: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
b5f0: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
b600: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
b610: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
b620: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
b630: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
b640: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
b650: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
b660: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
b670: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
b680: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
b690: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
b6a0: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
b6b0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
b6c0: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
b6d0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
b6e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b6f0: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
b700: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
b710: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
b720: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
b730: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
b740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
b750: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
b760: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
b770: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
b780: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
b790: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
b7a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
b7b0: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
b7c0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
b7d0: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
b7e0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b7f0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
b800: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
b810: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
b820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b830: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
b840: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
b850: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
b860: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
b870: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
b880: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
b890: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
b8a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b8b0: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
b8c0: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
b8d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
b8e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
b8f0: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
b900: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
b910: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
b940: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
b950: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
b960: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
b970: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
b980: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
b990: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
b9a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b9c0: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
b9d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
b9e0: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
ba10: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
ba20: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
ba30: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
ba40: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
ba50: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
ba60: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53  ntent */..  /* S
ba70: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
ba80: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
ba90: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
baa0: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
bab0: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
bac0: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
bad0: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
bae0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
baf0: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
bb00: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
bb10: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
bb20: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
bb30: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
bb40: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
bb50: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
bb60: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
bb70: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
bb80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
bb90: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
bba0: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
bbb0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
bbc0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
bbd0: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
bbe0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
bbf0: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
bc00: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
bc10: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
bc20: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
bc30: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
bc40: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
bc50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bc60: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
bc70: 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64  ) );..  pVfs = d
bc80: 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  b->pVfs;.  p = s
bc90: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
bca0: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
bcb0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
bcc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
bcd0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
bce0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
bcf0: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
bd00: 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  b;..#if !defined
bd10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
bd20: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
bd30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bd40: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
bd50: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
bd60: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
bd70: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
bd80: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
bd90: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
bda0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
bdb0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
bdc0: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
bdd0: 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26  f( isMemdb==0 &&
bde0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
bdf0: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
be00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
be10: 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
be20: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
be30: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
be40: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
be50: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
be60: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
be70: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
be80: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
be90: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
bea0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
beb0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
bec0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
bed0: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
bee0: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
bef0: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66  dCache;.      if
bf00: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
bf10: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
bf20: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
bf30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bf40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
bf50: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
bf60: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
bf70: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
bf80: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
bf90: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
bfa0: 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
bfb0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
bfc0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
bfd0: 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
bfe0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
bff0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
c000: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
c010: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
c020: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
c030: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
c040: 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
c050: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c060: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
c070: 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
c080: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
c090: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
c0a0: 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
c0b0: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
c0c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
c0d0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
c0e0: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
c0f0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
c100: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
c110: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
c120: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
c130: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
c140: 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
c150: 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
c160: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
c170: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44            for(iD
c180: 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b=db->nDb-1; iDb
c190: 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20  >=0; iDb--){.   
c1a0: 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a           Btree *
c1b0: 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e  pExisting = db->
c1c0: 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
c1d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
c1e0: 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73  xisting && pExis
c1f0: 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29  ting->pBt==pBt )
c200: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
c210: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
c220: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
c230: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
c240: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
c250: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c270: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
c280: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
c290: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c2a0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
c2b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c2c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c2d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
c2e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c2f0: 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
c300: 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  Bt;.          pB
c310: 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  t->nRef++;.     
c320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c330: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c340: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
c350: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
c360: 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  red);.      sqli
c370: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
c380: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  thname);.    }.#
c390: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c3a0: 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
c3b0: 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d     /* In debug m
c3c0: 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c  ode, we mark all
c3d0: 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61   persistent data
c3e0: 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c  bases as sharabl
c3f0: 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
c400: 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f  when they are no
c410: 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73  t.  This exercis
c420: 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
c430: 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ode and.      **
c440: 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f   gives more oppo
c450: 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65  rtunity for asse
c460: 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  rts(sqlite3_mute
c470: 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20  x_held()).      
c480: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  ** statements to
c490: 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72   find locking pr
c4a0: 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f  oblems..      */
c4b0: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
c4c0: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  le = 1;.    }.#e
c4d0: 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
c4e0: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
c4f0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
c500: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
c510: 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
c520: 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
c530: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
c540: 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  are.    ** the r
c550: 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
c560: 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
c570: 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
c580: 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
c590: 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
c5a0: 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ing on a differe
c5b0: 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nt architecture.
c5c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
c5d0: 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d  rt( sizeof(i64)=
c5e0: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34  =8 || sizeof(i64
c5f0: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
c600: 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
c610: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34  =8 || sizeof(u64
c620: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
c630: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
c640: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
c650: 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
c660: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c670: 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
c680: 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
c690: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
c6a0: 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
c6b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
c6c0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
c6d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c6e0: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
c6f0: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
c700: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
c710: 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
c720: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
c730: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
c760: 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a  ags, vfsFlags);.
c770: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c780: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
c790: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c7a0: 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
c7b0: 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
c7c0: 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
c7d0: 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
c7e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c7f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
c800: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
c810: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
c820: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73  ->db = db;.    s
c830: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
c840: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
c850: 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
c860: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
c870: 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
c880: 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71  = pBt;.  .    sq
c890: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
c8a0: 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65  niter(pBt->pPage
c8b0: 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  r, pageReinit);.
c8c0: 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
c8d0: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
c8e0: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
c8f0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73  Bt->readOnly = s
c900: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
c910: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
c920: 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  r);.    pBt->pag
c930: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
c940: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
c950: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
c960: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
c970: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
c980: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
c990: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
c9a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
c9b0: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
c9c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
c9d0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
c9e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c9f0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
ca00: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
ca10: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
ca20: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
ca30: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
ca40: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
ca50: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
ca60: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
ca70: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
ca80: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
ca90: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
caa0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
cab0: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
cac0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
cad0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
cae0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
caf0: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
cb00: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
cb10: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
cb20: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
cb30: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
cb40: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
cb50: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
cb60: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
cb70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
cb80: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
cb90: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
cba0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
cbb0: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
cbc0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
cbd0: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
cbe0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
cbf0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
cc00: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
cc10: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
cc20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
cc30: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
cc40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
cc50: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
cc60: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
cc70: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
cc80: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
cc90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
cca0: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
ccb0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
ccc0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
ccd0: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
cce0: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
ccf0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
cd00: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
cd10: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
cd20: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
cd30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
cd40: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
cd50: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
cd60: 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
cd70: 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
cd80: 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
cd90: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
cda0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
cdb0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
cdc0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
cdd0: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
cde0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
cdf0: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
ce00: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
ce10: 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
ce20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ce30: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
ce40: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
ce50: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
ce60: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
ce70: 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
ce80: 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
ce90: 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
cea0: 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
ceb0: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
cec0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
ced0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
cee0: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
cef0: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
cf00: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
cf10: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
cf20: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
cf30: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
cf40: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
cf50: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
cf60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
cf70: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
cf80: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
cf90: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
cfa0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
cfb0: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
cfc0: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
cfd0: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
cfe0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cff0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
d000: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d010: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
d020: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
d030: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
d040: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d050: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d060: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
d070: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
d080: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
d090: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
d0a0: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
d0b0: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
d0c0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
d0d0: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
d0e0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
d0f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
d100: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
d110: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
d120: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d130: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
d140: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
d150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
d160: 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
d170: 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
d180: 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
d190: 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
d1a0: 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
d1b0: 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
d1c0: 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
d1d0: 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
d1e0: 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
d1f0: 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
d200: 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
d210: 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
d220: 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
d230: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
d240: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
d250: 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
d260: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
d270: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d280: 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
d290: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
d2a0: 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
d2b0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
d2c0: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
d2d0: 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
d2e0: 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
d2f0: 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
d300: 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
d310: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
d320: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
d330: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
d340: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
d350: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
d360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d370: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
d380: 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
d390: 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
d3a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
d3b0: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
d3c0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
d3d0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
d3e0: 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
d3f0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
d400: 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
d410: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
d420: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
d430: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
d440: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
d450: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
d460: 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
d470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d480: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d490: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
d4a0: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
d4b0: 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
d4c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d4d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
d4e0: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
d4f0: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
d500: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
d510: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
d520: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
d530: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
d540: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
d550: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
d560: 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
d570: 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
d580: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d590: 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
d5a0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
d5b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
d5c0: 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
d5d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d5e0: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
d5f0: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
d600: 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
d610: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
d620: 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
d630: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
d640: 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
d650: 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
d660: 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
d670: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
d680: 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
d690: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
d6a0: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
d6b0: 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
d6c0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
d6d0: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
d6e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
d6f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d700: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
d710: 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  E.  sqlite3_mute
d720: 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74  x *pMaster;.  Bt
d730: 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
d740: 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
d750: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
d760: 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
d770: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
d780: 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71  ;.  pMaster = sq
d790: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
d7a0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
d7b0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73  TIC_MASTER);.  s
d7c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d7d0: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
d7e0: 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
d7f0: 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
d800: 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
d810: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
d820: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
d830: 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
d840: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
d850: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
d860: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
d870: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
d880: 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
d890: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
d8a0: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
d8b0: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
d8c0: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
d8d0: 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
d8e0: 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
d8f0: 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
d900: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
d910: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
d920: 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
d930: 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
d940: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
d950: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d960: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
d970: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
d980: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
d990: 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
d9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
d9b0: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
d9c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d9d0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
d9e0: 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
d9f0: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
da00: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
da10: 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
da20: 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
da30: 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
da40: 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
da50: 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e  SIZE(pBt) bytes.
da60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
da70: 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
da80: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
da90: 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
daa0: 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
dab0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
dac0: 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
dad0: 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
dae0: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
daf0: 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
db00: 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
db10: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
db20: 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
db30: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
db40: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
db50: 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ee( pBt->pTmpSpa
db60: 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70  ce);.  pBt->pTmp
db70: 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Space = 0;.}../*
db80: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
db90: 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
dba0: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
dbb0: 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
dbc0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
dbd0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
dbe0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
dbf0: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
dc00: 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
dc10: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
dc20: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
dc30: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
dc40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
dc50: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
dc60: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
dc70: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
dc80: 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
dc90: 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
dca0: 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
dcb0: 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
dcc0: 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
dcd0: 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
dce0: 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
dcf0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
dd00: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
dd10: 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
dd20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
dd30: 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
dd40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
dd50: 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
dd60: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
dd70: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
dd80: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
dd90: 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
dda0: 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
ddb0: 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
ddc0: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
ddd0: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
dde0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
ddf0: 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
de00: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
de10: 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
de20: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
de30: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
de40: 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
de50: 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
de60: 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
de70: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
de80: 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
de90: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
dea0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
deb0: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
dec0: 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
ded0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
dee0: 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
def0: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
df00: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
df10: 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
df20: 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
df30: 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
df40: 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
df50: 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
df60: 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
df70: 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
df80: 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
df90: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
dfa0: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
dfb0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
dfc0: 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
dfd0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
dfe0: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
dff0: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
e000: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
e010: 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
e020: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
e030: 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
e040: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
e050: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e060: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
e070: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
e080: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
e090: 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
e0a0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
e0b0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e0c0: 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
e0d0: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
e0e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
e0f0: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
e100: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
e110: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
e120: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
e130: 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
e140: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
e150: 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
e160: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
e170: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e180: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
e190: 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
e1a0: 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
e1b0: 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
e1c0: 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
e1d0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
e1e0: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
e1f0: 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
e200: 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
e210: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
e220: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
e230: 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
e240: 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
e250: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
e260: 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
e270: 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
e280: 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
e290: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
e2a0: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
e2b0: 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
e2c0: 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
e2d0: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
e2e0: 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
e2f0: 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
e300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
e310: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
e320: 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
e330: 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
e340: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
e350: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
e360: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
e370: 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
e380: 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
e390: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
e3a0: 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
e3b0: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
e3c0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
e3d0: 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
e3e0: 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
e3f0: 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
e400: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
e410: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
e420: 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
e430: 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
e440: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
e450: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
e460: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
e470: 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
e480: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
e490: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e4a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
e4b0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
e4c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e4d0: 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
e4e0: 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
e4f0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
e500: 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
e510: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
e520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e530: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
e540: 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
e550: 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
e560: 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
e570: 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
e580: 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
e590: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
e5a0: 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
e5b0: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
e5c0: 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
e5d0: 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
e5e0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
e5f0: 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
e600: 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
e610: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
e620: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
e630: 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
e640: 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
e650: 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
e660: 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
e670: 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
e680: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
e690: 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
e6a0: 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
e6b0: 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
e6c0: 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
e6d0: 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
e6e0: 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
e6f0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
e700: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
e710: 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
e720: 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
e730: 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20  Level(Btree *p, 
e740: 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
e750: 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68  ullSync){.  BtSh
e760: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
e770: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
e780: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e790: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
e7a0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
e7b0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
e7c0: 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
e7d0: 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
e7e0: 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
e7f0: 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
e800: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
e810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e820: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
e830: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
e840: 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
e850: 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
e860: 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
e870: 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
e880: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
e890: 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
e8a0: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
e8b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e8c0: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
e8d0: 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
e8e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
e8f0: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
e900: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e910: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
e920: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
e930: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
e940: 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
e950: 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
e960: 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
e970: 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
e980: 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
e990: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
e9a0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
e9b0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
e9c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e9d0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
e9e0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
e9f0: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
ea00: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
ea10: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
ea20: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
ea30: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
ea40: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
ea50: 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
ea60: 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
ea70: 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
ea80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
ea90: 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
eaa0: 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
eab0: 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
eac0: 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
ead0: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
eae0: 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
eaf0: 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
eb00: 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
eb10: 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
eb20: 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
eb30: 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
eb40: 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
eb50: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
eb60: 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
eb70: 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
eb80: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
eb90: 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
eba0: 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
ebb0: 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
ebc0: 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
ebd0: 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
ebe0: 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
ebf0: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
ec00: 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
ec10: 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
ec20: 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
ec30: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
ec40: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
ec50: 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
ec60: 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
ec70: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
ec80: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
ec90: 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
eca0: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
ecb0: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
ecc0: 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
ecd0: 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65 46  en the pageSizeF
ece0: 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  ixed flag is set
ecf0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
ed00: 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
ed10: 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
ed20: 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
ed30: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
ed40: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
ed50: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
ed60: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
ed70: 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
ed80: 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
ed90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
eda0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
edb0: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
edc0: 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
edd0: 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
ede0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
edf0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
ee00: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
ee10: 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
ee20: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
ee30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ee40: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
ee50: 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
ee60: 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
ee70: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
ee80: 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
ee90: 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
eea0: 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
eeb0: 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
eec0: 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
eed0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
eee0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
eef0: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
ef00: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
ef10: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
ef20: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
ef30: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
ef40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
ef50: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
ef60: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
ef70: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
ef80: 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
ef90: 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
efa0: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
efb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
efc0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
efd0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
efe0: 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
eff0: 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
f000: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
f010: 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
f020: 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
f030: 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53  Fix ) pBt->pageS
f040: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20  izeFixed = 1;.  
f050: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
f060: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
f070: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
f080: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
f090: 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
f0a0: 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
f0b0: 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
f0c0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
f0d0: 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
f0e0: 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
f0f0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
f100: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
f110: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
f120: 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
f130: 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
f140: 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
f150: 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
f160: 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
f170: 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
f180: 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
f190: 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
f1a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
f1b0: 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
f1c0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
f1d0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
f1e0: 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
f1f0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
f200: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
f210: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
f220: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
f230: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
f240: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
f250: 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
f260: 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
f270: 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
f280: 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
f290: 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
f2a0: 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
f2b0: 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
f2c0: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
f2d0: 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
f2e0: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
f2f0: 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
f300: 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
f310: 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
f320: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
f330: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
f340: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
f350: 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
f360: 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
f370: 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
f380: 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
f390: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
f3a0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e   return n;.}.#en
f3b0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
f3c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
f3d0: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
f3e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f3f0: 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
f400: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
f410: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
f420: 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
f430: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
f440: 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
f450: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
f460: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
f470: 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
f480: 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
f490: 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
f4a0: 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
f4b0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
f4c0: 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
f4d0: 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
f4e0: 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
f4f0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
f500: 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
f510: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f520: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
f530: 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
f540: 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
f550: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f560: 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
f570: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
f580: 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
f590: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
f5a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f5b0: 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
f5c0: 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
f5d0: 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
f5e0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
f5f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
f600: 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  ed && (av ?1:0)!
f610: 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
f620: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
f630: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
f640: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
f650: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
f660: 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
f670: 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
f680: 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
f690: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
f6a0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
f6b0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
f6c0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
f6d0: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
f6e0: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
f6f0: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
f700: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
f710: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
f720: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
f730: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
f740: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
f750: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
f760: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f770: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
f780: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
f790: 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
f7a0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
f7b0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
f7c0: 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
f7d0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
f7e0: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
f7f0: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
f800: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
f810: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
f820: 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
f830: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
f840: 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
f850: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
f860: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
f870: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
f880: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
f890: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
f8a0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
f8b0: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
f8c0: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
f8d0: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
f8e0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
f8f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
f900: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
f910: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
f920: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
f930: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
f940: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f950: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
f960: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
f970: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
f980: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
f990: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
f9a0: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
f9b0: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
f9c0: 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
f9d0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
f9e0: 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
f9f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
fa00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
fa10: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
fa20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fa30: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
fa40: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
fa50: 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
fa60: 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
fa70: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
fa80: 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
fa90: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
faa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
fab0: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
fac0: 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
fad0: 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
fae0: 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
faf0: 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
fb00: 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
fb10: 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63  file. .  */.  rc
fb20: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
fb30: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
fb40: 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
fb50: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fb60: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70  OK ){.    goto p
fb70: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
fb80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50  ;.  }else if( nP
fb90: 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  age>0 ){.    int
fba0: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69   pageSize;.    i
fbb0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  nt usableSize;. 
fbc0: 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
fbd0: 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
fbe0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
fbf0: 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65  TADB;.    if( me
fc00: 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
fc10: 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
fc20: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
fc30: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
fc40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fc50: 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
fc60: 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e       pBt->readOn
fc70: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ly = 1;.    }.  
fc80: 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
fc90: 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
fca0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
fcb0: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
fcc0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
fcd0: 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
fce0: 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
fcf0: 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
fd00: 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
fd10: 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
fd20: 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
fd30: 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
fd40: 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
fd50: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
fd60: 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
fd70: 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
fd80: 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
fd90: 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
fda0: 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
fdb0: 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
fdc0: 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
fdd0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
fde0: 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
fdf0: 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
fe00: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
fe10: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
fe20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
fe30: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
fe40: 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20  page1[16]);.    
fe50: 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31  if( ((pageSize-1
fe60: 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c  )&pageSize)!=0 |
fe70: 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  | pageSize<512 |
fe80: 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49 54  |.        (SQLIT
fe90: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c  E_MAX_PAGE_SIZE<
fea0: 33 32 37 36 38 20 26 26 20 70 61 67 65 53 69 7a  32768 && pageSiz
feb0: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
fec0: 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20  E_SIZE).    ){. 
fed0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
fee0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
fef0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
ff00: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
ff10: 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   );.    usableSi
ff20: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
ff30: 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
ff40: 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74  f( pageSize!=pBt
ff50: 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
ff60: 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
ff70: 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
ff80: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
ff90: 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
ffa0: 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
ffb0: 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
ffc0: 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
ffd0: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
ffe0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
fff0: 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
10000 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
10010 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
10020 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
10030 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
10040 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
10050 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
10060 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
10070 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
10080 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
10090 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
100a0 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
100b0 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
100c0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
100d0 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
100e0 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65  ze = (u16)usable
100f0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
10100 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
10110 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  )pageSize;.     
10120 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10130 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
10140 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10150 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
10160 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
10170 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
101a0 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
101b0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
101c0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
101d0 6c 65 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72  led;.      retur
101e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
101f0 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c   }.    if( usabl
10200 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
10210 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
10220 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
10230 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
10240 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
10250 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
10260 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75  bleSize = (u16)u
10270 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
10280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10290 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
102a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
102b0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
102c0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
102d0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
102e0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
102f0 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
10300 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
10310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
10320 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
10330 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
10340 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
10350 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
10360 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
10370 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
10380 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
10390 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
103a0 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
103b0 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
103c0 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
103d0 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
103e0 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
103f0 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
10400 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
10410 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
10420 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
10430 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
10440 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
10450 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
10460 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
10470 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
10480 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
10490 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
104a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
104b0 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
104c0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
104d0 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c  a 2-byte poiner,
104e0 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
104f0 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
10500 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
10510 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
10520 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
10530 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
10540 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
10550 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
10560 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
10570 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
10580 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
10590 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 23;.  pBt->mi
105a0 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  nLocal = (pBt->u
105b0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
105c0 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
105d0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
105e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
105f0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
10600 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
10610 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
10620 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70   23;.  assert( p
10630 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
10640 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
10650 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
10660 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
10670 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10680 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
10690 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
106a0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
106b0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
106c0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
106d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
106e0 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
106f0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63   lockBtree() exc
10700 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f  ept that it also
10710 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
10720 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
10730 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63   there is lock c
10740 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ontention..*/.st
10750 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
10760 65 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65  eeWithRetry(Btre
10770 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20  e *pRef){.  int 
10780 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10790 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
107a0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
107b0 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28  x(pRef) );.  if(
107c0 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d   pRef->inTrans==
107d0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
107e0 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69    u8 inTransacti
107f0 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e  on = pRef->pBt->
10800 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
10810 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
10820 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20  y(pRef);.    rc 
10830 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
10840 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30  ginTrans(pRef, 0
10850 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74  );.    pRef->pBt
10860 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
10870 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  = inTransaction;
10880 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61  .    pRef->inTra
10890 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
108a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
108b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
108c0 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  pRef->pBt->nTran
108d0 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d  saction--;.    }
108e0 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
108f0 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20  ity(pRef);.  }. 
10900 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20   return rc;.}.  
10910 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20       ../*.** If 
10920 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
10930 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
10940 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
10950 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
10960 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
10970 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
10980 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
10990 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
109a0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
109b0 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
109c0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
109d0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
109e0 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
109f0 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
10a00 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
10a10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
10a20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  are any outstand
10a30 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69  ing cursors, thi
10a40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10a50 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
10a60 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
10a70 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
10a80 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10a90 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10aa0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
10ab0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
10ac0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10ad0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10ae0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10af0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
10b00 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
10b10 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
10b20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  && pBt->pCursor=
10b30 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  =0 && pBt->pPage
10b40 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  1!=0 ){.    if( 
10b50 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
10b60 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
10b70 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73  )>=1 ){.      as
10b80 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
10b90 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
10ba0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
10bb0 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
10bc0 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  }.    pBt->pPage
10bd0 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1 = 0;.  }.}../*
10be0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
10bf0 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
10c00 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
10c10 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a  rst page of the.
10c20 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
10c30 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
10c40 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
10c50 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10c60 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
10c70 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
10c80 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  rc;.  int nPage;
10c90 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
10ca0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10cb0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10cc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10cd0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
10ce0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
10cf0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10d00 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20  E_OK || nPage>0 
10d10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10d20 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
10d30 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
10d40 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
10d50 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
10d60 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
10d70 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
10d80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
10d90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
10da0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
10db0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
10dc0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
10dd0 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
10de0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
10df0 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75  der)==16 );.  pu
10e00 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d  t2byte(&data[16]
10e10 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
10e20 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
10e30 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
10e40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
10e50 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
10e60 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
10e70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
10e80 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
10e90 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
10ea0 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
10eb0 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
10ec0 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
10ed0 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
10ee0 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
10ef0 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
10f00 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
10f10 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
10f20 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
10f30 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
10f40 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
10f50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
10f60 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
10f70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
10f80 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
10f90 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
10fa0 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
10fb0 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
10fc0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
10fd0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
10fe0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
10ff0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
11000 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
11010 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
11020 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
11030 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
11040 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
11050 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
11060 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11070 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
11080 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
11090 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
110a0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
110b0 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
110c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
110d0 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
110e0 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
110f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
11100 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
11110 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
11120 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
11130 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
11140 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
11150 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
11160 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
11170 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
11180 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
11190 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
111a0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
111b0 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
111c0 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
111d0 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
111e0 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
111f0 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
11200 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
11210 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
11220 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
11230 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
11240 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
11250 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
11260 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
11270 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
11280 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
11290 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
112a0 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
112b0 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
112c0 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
112d0 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
112e0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
112f0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
11300 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
11310 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
11320 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
11330 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
11340 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
11350 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
11360 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
11370 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
11380 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
11390 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
113a0 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
113b0 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
113c0 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
113d0 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
113e0 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
113f0 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
11400 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
11410 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
11420 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
11430 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
11440 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
11450 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
11460 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
11470 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
11480 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
11490 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
114a0 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
114b0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
114c0 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
114d0 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
114e0 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
114f0 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
11500 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
11510 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
11520 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
11530 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
11540 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
11550 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
11560 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
11570 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
11580 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
11590 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
115a0 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
115b0 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
115c0 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
115d0 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
115e0 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
115f0 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
11600 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
11610 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
11620 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
11630 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
11640 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
11650 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
11660 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
11670 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
11680 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
11690 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
116a0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
116b0 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
116c0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
116d0 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
116e0 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
116f0 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
11700 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11710 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
11720 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
11730 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  flag){.  sqlite3
11740 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
11750 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11760 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
11770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
11780 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11790 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
117a0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
117b0 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
117c0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
117d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
117e0 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
117f0 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
11800 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
11810 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
11820 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
11830 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
11840 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
11850 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
11860 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
11870 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
11880 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
11890 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
118a0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
118b0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
118c0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
118d0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
118e0 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
118f0 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
11900 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
11910 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
11920 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11930 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
11940 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
11950 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
11960 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
11970 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
11980 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
11990 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
119a0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
119b0 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
119c0 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
119d0 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
119e0 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
119f0 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
11a00 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
11a10 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
11a20 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c    */.  if( (wrfl
11a30 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
11a40 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
11a50 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69  WRITE) || pBt->i
11a60 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20  sPending ){.    
11a70 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
11a80 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
11a90 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
11aa0 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
11ab0 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
11ac0 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
11ad0 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
11ae0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
11af0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
11b00 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
11b10 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
11b20 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
11b30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11b40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
11b50 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
11b60 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
11b70 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
11b80 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
11b90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
11ba0 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
11bb0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
11bc0 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
11bd0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ..  do {.    /* 
11be0 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
11bf0 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
11c00 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
11c10 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
11c20 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
11c30 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
11c40 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
11c50 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
11c60 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
11c70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
11c80 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
11c90 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
11ca0 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
11cb0 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
11cc0 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
11cd0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
11ce0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
11cf0 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
11d00 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
11d10 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
11d20 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
11d30 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
11d40 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
11d50 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
11d60 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
11d70 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
11d80 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
11d90 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
11da0 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
11db0 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
11dc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11dd0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
11de0 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
11df0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
11e00 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
11e10 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
11e20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11e30 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
11e40 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
11e50 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
11e60 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
11e70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
11e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11e90 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
11ea0 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
11eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11ec0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
11ed0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11ee0 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
11ef0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
11f00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
11f10 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
11f20 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
11f30 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
11f40 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
11f50 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
11f60 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
11f70 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
11f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
11f90 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
11fa0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
11fb0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
11fc0 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on++;.    }.    
11fd0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
11fe0 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
11ff0 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
12000 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12010 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
12020 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
12030 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
12040 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
12050 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
12060 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12070 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66  ACHE.    if( wrf
12080 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  lag ){.      ass
12090 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
120a0 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
120b0 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
120c0 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75      pBt->isExclu
120d0 73 69 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c  sive = (u8)(wrfl
120e0 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ag>1);.    }.#en
120f0 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f  dif.  }...trans_
12100 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
12110 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
12120 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
12130 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
12140 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
12150 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
12160 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
12170 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
12180 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
12190 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
121a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
121b0 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
121c0 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
121d0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
121e0 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
121f0 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
12200 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
12210 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
12220 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
12230 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
12240 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
12250 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
12260 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12270 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12280 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
12290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
122a0 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
122b0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
122c0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
122d0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
122e0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
122f0 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
12300 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
12310 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
12320 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
12330 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
12340 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
12350 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
12360 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
12370 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
12380 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
12390 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
123c0 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
123d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12400 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
12410 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
12420 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12440 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
12450 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
12460 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
12470 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
12480 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
12490 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
124a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
124b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
124c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
124d0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
124e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
124f0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
12500 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
12510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12520 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
12530 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
12540 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
12550 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
12560 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
12570 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
12580 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
12590 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20  ge, i);..    rc 
125a0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
125b0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
125c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
125d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
125e0 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
125f0 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
12600 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
12610 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
12620 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
12630 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
12640 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  l);.      rc = p
12650 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
12660 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
12670 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
12680 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12690 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74  TE_OK ) goto set
126a0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
126b0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
126c0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
126d0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
126e0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
126f0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
12700 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12710 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  t+8]);.    rc = 
12720 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
12730 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
12740 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
12750 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
12760 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
12770 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
12780 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
12790 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
127a0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
127b0 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  e, which is guar
127c0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62  anteed to be a b
127d0 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61  tree page, not a
127e0 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
127f0 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ge, is a pointer
12800 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
12810 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
12820 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
12830 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e  oints to.** iTo.
12840 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
12850 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
12860 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
12870 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  o be modified, a
12880 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s .** follows:.*
12890 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
128a0 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
128b0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
128c0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
128d0 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128f0 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
12900 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
12910 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
12920 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
12930 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
12940 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
12950 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
12960 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
12970 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
12980 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
12990 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
129a0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
129b0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
129c0 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
129d0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
129e0 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
129f0 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
12a00 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
12a10 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
12a20 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
12a30 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
12a40 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
12a50 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
12a60 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
12a70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12a80 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
12a90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
12aa0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12ab0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
12ac0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
12ad0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
12ae0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
12af0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
12b00 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
12b10 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
12b20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
12b30 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
12b40 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
12b50 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
12b60 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
12b70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12b80 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
12b90 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
12ba0 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
12bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
12bc0 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
12bd0 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
12be0 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
12bf0 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Cell;..    sqlit
12c00 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
12c10 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c  pPage);.    nCel
12c20 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
12c30 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
12c40 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
12c50 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
12c60 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
12c70 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
12c80 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
12c90 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
12ca0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
12cb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12cc0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
12cd0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
12ce0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
12cf0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
12d00 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
12d10 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
12d20 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
12d30 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
12d40 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
12d50 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
12d60 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
12d70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
12d80 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
12d90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12db0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
12dc0 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
12dd0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
12de0 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
12df0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12e00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12e10 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
12e20 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
12e30 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
12e40 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
12e50 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
12e60 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
12e70 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12e80 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
12e90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12ea0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12eb0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
12ec0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
12ed0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
12ee0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
12ef0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
12f00 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
12f10 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
12f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12f30 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
12f40 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
12f50 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
12f60 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
12f70 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
12f80 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
12f90 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
12fa0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
12fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
12fc0 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
12fd0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
12fe0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
12ff0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
13000 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
13010 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
13020 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
13030 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
13040 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
13050 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
13060 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
13070 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
13080 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
13090 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
130a0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
130b0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
130c0 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
130d0 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
130e0 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
130f0 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
13100 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  ommit.){.  MemPa
13110 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
13120 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
13130 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
13140 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
13150 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
13160 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
13170 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
13180 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
13190 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
131a0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
131b0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
131c0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
131d0 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
131e0 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
131f0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
13200 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
13210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13220 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13230 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
13240 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
13250 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
13260 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
13270 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
13280 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
13290 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
132a0 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
132b0 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
132c0 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
132d0 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
132e0 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
132f0 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
13300 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
13310 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
13320 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
13330 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
13340 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
13350 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
13360 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
13370 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
13390 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
133a0 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
133b0 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
133c0 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
133d0 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
133e0 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
133f0 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
13400 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
13410 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
13420 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
13430 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
13440 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
13450 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
13460 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
13470 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
13480 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
13490 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
134a0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
134b0 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
134c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
134d0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
134e0 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
134f0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
13500 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
13510 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
13520 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
13530 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
13540 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
13550 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
13560 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
13570 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
13580 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
13590 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
135a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
135b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
135c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
135d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
135e0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
135f0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
13600 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
13610 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
13620 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l!=0 ){.      rc
13630 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
13640 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
13650 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
13660 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20  reePage);.      
13670 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13680 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
13690 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
136a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
136b0 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
136c0 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
136d0 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
136e0 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
136f0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
13700 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
13710 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
13720 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
13730 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
13740 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
13750 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
13760 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
13770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
13780 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
13790 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
137a0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
137b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
137c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
137d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
137e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
137f0 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
13800 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
13810 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13820 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13830 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
13840 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13850 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
13860 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
13870 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
13880 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
13890 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
138a0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
138b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
138c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
138d0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
138e0 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
138f0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b  Type, iPtrPage);
13900 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13910 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
13920 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
13930 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
13940 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
13950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
13960 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
13970 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
13980 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
13990 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
139a0 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
139b0 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
139c0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
139d0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
139e0 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
139f0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
13a00 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
13a10 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
13a20 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61  o.** point in ca
13a30 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
13a40 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
13a50 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
13a60 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
13a70 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
13a80 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
13a90 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
13aa0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f   .** database so
13ab0 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
13ac0 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
13ad0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
13ae0 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
13af0 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49   in use..**.** I
13b00 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d  f the nFin param
13b10 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
13b20 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
13b30 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20  tion assumes.** 
13b40 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
13b50 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
13b60 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
13b70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72  () until.** it r
13b80 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
13b90 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20  NE or an error, 
13ba0 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73  and that nFin is
13bb0 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
13bc0 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61  f pages the data
13bd0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63  base file will c
13be0 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69  ontain after thi
13bf0 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  s .** process is
13c00 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74   complete..*/.st
13c10 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
13c20 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
13c30 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
13c40 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b  , Pgno iLastPg){
13c50 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
13c60 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
13c70 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
13c80 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
13c90 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
13ca0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13cb0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
13cc0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
13cd0 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
13ce0 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
13cf0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
13d00 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
13d10 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
13d20 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69  GE(pBt) ){.    i
13d30 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54  nt rc;.    u8 eT
13d40 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
13d50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
13d60 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
13d70 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
13d80 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
13d90 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
13da0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13db0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
13dc0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
13dd0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
13de0 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
13df0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
13e00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13e10 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13e20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
13e30 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
13e40 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
13e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13e60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
13e70 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
13e80 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
13e90 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
13ea0 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
13eb0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
13ec0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
13ed0 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
13ee0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
13ef0 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
13f00 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d   if nFin is non-
13f10 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
13f20 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
13f30 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
13f40 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
13f50 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
13f60 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
13f70 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
13f80 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
13f90 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
13fa0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
13fb0 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
13fc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13fd0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
13fe0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
13ff0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
14000 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
14010 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
14020 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
14030 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a  g, iLastPg, 1);.
14040 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
14050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14060 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
14070 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14080 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
14090 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
140a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
140b0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
140c0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
140d0 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
140e0 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
140f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
14100 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
14110 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
14120 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
14130 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63  astPg;..      rc
14140 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
14150 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
14160 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
14170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14190 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
141a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
141b0 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  /* If nFin is ze
141c0 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
141d0 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
141e0 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
141f0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
14200 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
14210 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
14220 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
14230 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
14240 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
14250 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
14260 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20  nFin is greater 
14270 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
14280 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
14290 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
142a0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
142b0 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
142c0 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
142d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
142e0 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
142f0 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   */.      do {. 
14300 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
14310 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
14320 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
14330 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
14340 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
14350 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
14360 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14370 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
14380 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
14390 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
143a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
143b0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
143c0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
143d0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
143e0 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65  nFin!=0 && iFree
143f0 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
14400 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
14410 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
14420 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
14430 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
14440 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65  pLastPg->pDbPage
14450 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
14460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14470 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
14480 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
14490 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
144a0 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
144b0 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20  nFin!=0);.      
144c0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
144d0 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
144e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
144f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14500 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
14520 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
14530 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
14540 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50     while( iLastP
14550 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
14560 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41  PAGE(pBt)||PTRMA
14570 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
14580 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20  astPg) ){.      
14590 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
145a0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
145b0 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  ){.        MemPa
145c0 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20  ge *pPg;.       
145d0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
145e0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
145f0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67  t, iLastPg, &pPg
14600 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
14610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
14630 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
14640 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
14650 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
14660 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
14670 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
14680 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
14690 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
146a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
146b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
146c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
146d0 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
146e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
146f0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
14700 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
14710 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20  iLastPg);.  }.  
14720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
14740 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
14750 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
14760 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
14770 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
14780 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
14790 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
147a0 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
147b0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
147c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
147d0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
147e0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
147f0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
14800 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
14810 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
14820 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
14830 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
14840 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
14850 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
14860 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
14870 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
14880 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
14890 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
148a0 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
148b0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
148c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
148d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
148e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
148f0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
14900 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14910 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
14920 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
14930 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
14940 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
14950 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
14960 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
14970 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  lse{.    invalid
14980 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
14990 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  che(pBt);.    rc
149a0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
149b0 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72 50  p(pBt, 0, pagerP
149c0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a  agecount(pBt));.
149d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
149e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
149f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14a00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14a10 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
14a20 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
14a30 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
14a40 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
14a50 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mmited for an au
14a60 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
14a70 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
14a80 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14a90 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
14aa0 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
14ab0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
14ac0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14ad0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
14ae0 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
14af0 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
14b00 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
14b10 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
14b20 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
14b30 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
14b40 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
14b50 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
14b60 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
14b70 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
14b80 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
14b90 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
14ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
14bb0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
14bc0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41  t->pPager;.  VVA
14bd0 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20  _ONLY( int nRef 
14be0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
14bf0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
14c00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
14c10 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14c20 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14c30 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
14c40 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
14c50 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
14c60 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
14c70 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
14c80 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
14c90 6e 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  nFin;.    Pgno n
14ca0 46 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  Free;.    Pgno n
14cb0 50 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e 6f  Ptrmap;.    Pgno
14cc0 20 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73   iFree;.    cons
14cd0 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74  t int pgsz = pBt
14ce0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
14cf0 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61 67  Pgno nOrig = pag
14d00 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
14d10 3b 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  ;..    if( PTRMA
14d20 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
14d30 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
14d40 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
14d50 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
14d60 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
14d70 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
14d80 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
14d90 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
14da0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
14db0 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
14dc0 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
14dd0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
14de0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
14df0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
14e00 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
14e10 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
14e20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
14e30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14e40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
14e50 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
14e60 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
14e70 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
14e80 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46     nPtrmap = (nF
14e90 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
14ea0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
14eb0 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73  ig)+pgsz/5)/(pgs
14ec0 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  z/5);.    nFin =
14ed0 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
14ee0 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
14ef0 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
14f00 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
14f10 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
14f20 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
14f30 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
14f40 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
14f50 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
14f60 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
14f70 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
14f80 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
14f90 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
14fa0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
14fb0 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
14fc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
14fd0 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
14fe0 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
14ff0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
15000 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
15010 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
15020 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
15030 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
15040 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
15050 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
15060 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
15070 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
15080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15090 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
150a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
150b0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
150c0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
150d0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
150e0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
150f0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
15100 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
15110 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
15120 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
15130 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
15140 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
15150 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
15160 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15170 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
15180 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
15190 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
151a0 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
151b0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
151c0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
151d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
151e0 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
151f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
15200 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
15210 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
15220 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
15230 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
15240 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
15250 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
15260 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
15270 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
15280 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
15290 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
152a0 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
152b0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
152c0 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
152d0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
152e0 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
152f0 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
15300 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
15310 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
15320 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
15330 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
15340 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
15350 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
15360 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
15370 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
15380 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
15390 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
153a0 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
153b0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
153c0 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
153d0 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
153e0 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
153f0 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
15400 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
15410 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
15420 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
15430 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
15440 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
15450 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
15460 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
15470 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
15480 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
15490 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
154a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
154b0 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
154c0 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
154d0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
154e0 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
154f0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
15500 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
15510 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
15520 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
15530 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
15540 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
15550 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
15560 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
15570 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
15580 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
15590 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
155a0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
155b0 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
155c0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
155d0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
155e0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
155f0 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
15600 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
15610 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
15620 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
15630 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
15640 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
15650 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
15660 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
15670 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
15680 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
15690 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
156a0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
156b0 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
156c0 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
156d0 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
156e0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
156f0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
15700 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
15710 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
15720 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
15730 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
15740 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
15750 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
15760 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
15770 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
15780 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
15790 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
157a0 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
157b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
157c0 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
157d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
157e0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
157f0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
15800 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15810 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
15820 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15830 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
15840 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
15850 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
15860 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
15870 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
15880 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
15890 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
158a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
158b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
158c0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
158d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
158e0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
158f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15900 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
15910 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
15920 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
15930 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
15940 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
15950 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15960 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
15970 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
15980 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
15990 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
159a0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
159b0 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
159c0 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
159d0 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
159e0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
159f0 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
15a00 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
15a10 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
15a20 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
15a30 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
15a40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
15a50 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
15a60 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
15a70 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
15a80 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
15a90 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
15aa0 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
15ab0 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
15ac0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
15ad0 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
15ae0 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
15af0 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
15b00 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
15b10 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
15b20 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
15b30 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
15b40 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
15b50 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
15b60 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
15b70 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
15b80 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
15b90 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
15ba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
15bb0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
15bc0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
15bd0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
15be0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
15bf0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
15c00 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
15c10 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
15c20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15c30 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
15c40 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
15c50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15c60 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
15c70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15c80 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
15c90 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
15ca0 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
15cb0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
15cc0 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
15cd0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
15ce0 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
15cf0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
15d00 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
15d10 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
15d20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
15d30 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
15d40 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
15d50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
15d60 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
15d70 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
15d80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
15d90 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
15da0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15db0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
15dc0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
15dd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15df0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15e00 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
15e10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
15e20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15e30 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
15e40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
15e50 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e  he handle has an
15e60 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
15e70 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
15e80 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61  ement the transa
15e90 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74  ction.  ** count
15ea0 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
15eb0 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
15ec0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72  nsaction count r
15ed0 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20  eaches 0, set.  
15ee0 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74  ** the shared st
15ef0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
15f00 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
15f10 65 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c  eeIfUnused() cal
15f20 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c  l below.  ** wil
15f30 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
15f40 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
15f50 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
15f60 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 63 6c 65  _NONE ){.    cle
15f70 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
15f80 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
15f90 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
15fa0 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tion--;.    if( 
15fb0 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
15fc0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
15fd0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15fe0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
15ff0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
16000 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
16010 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
16020 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
16030 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74  nd unlock.  ** t
16040 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73  he pager if this
16050 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
16060 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
16070 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
16080 0a 20 20 2a 2f 0a 20 20 62 74 72 65 65 43 6c 65  .  */.  btreeCle
16090 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
160a0 29 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  );.  p->inTrans 
160b0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
160c0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
160d0 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
160e0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
160f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16100 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16120 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
16130 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
16140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16150 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
16160 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
16170 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16180 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
16190 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
161a0 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
161b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
161c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
161d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
161e0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
161f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
16200 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16210 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
16220 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
16230 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
16240 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
16250 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
16260 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
16270 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
16280 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
16290 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
162a0 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
162b0 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
162c0 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
162d0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
162e0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
162f0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
16300 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
16310 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
16320 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
16330 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
16340 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
16350 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
16360 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
16370 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
16380 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
16390 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
163a0 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
163b0 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
163c0 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
163d0 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
163e0 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
163f0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
16400 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
16410 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
16420 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
16430 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
16440 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
16450 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
16460 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
16470 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
16480 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
16490 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
164a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
164b0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
164c0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
164d0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
164e0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
164f0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
16500 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
16510 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
16520 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
16530 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
16540 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
16550 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
16560 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
16570 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
16580 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
16590 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
165a0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
165b0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
165c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
165d0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
165e0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
165f0 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
16600 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
16610 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
16620 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
16630 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
16640 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
16650 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
16660 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
16670 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
16680 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
16690 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
166a0 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
166b0 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
166c0 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
166d0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
166e0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
166f0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
16700 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
16710 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
16720 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
16730 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
16740 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
16750 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
16760 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16770 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
16780 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
16790 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
167a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
167b0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
167c0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
167d0 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
167e0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
167f0 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65  .    p->skip = e
16800 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28  rrCode;.    for(
16810 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
16820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
16830 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
16840 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  age[i]);.      p
16850 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
16860 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
16870 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16880 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Btree);.}../*.**
16890 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
168a0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
168b0 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73  gress.  All curs
168c0 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  ors will be.** i
168d0 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73  nvalided by this
168e0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
168f0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
16900 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74  a cursor.** that
16910 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
16920 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
16930 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  is operation wil
16940 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  l result.** in a
16950 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
16960 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
16970 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
16980 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16990 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
169a0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
169b0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
169c0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
169d0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
169e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
169f0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b  lback(Btree *p){
16a00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
16a10 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16a20 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
16a30 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
16a40 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16a50 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  .  rc = saveAllC
16a60 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
16a70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
16a80 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
16a90 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51  CHE.  if( rc!=SQ
16aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
16ab0 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72  * This is a horr
16ac0 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20  ible situation. 
16ad0 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  An IO or malloc(
16ae0 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  ) error occurred
16af0 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74   whilst.    ** t
16b00 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75  rying to save cu
16b10 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20  rsor positions. 
16b20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
16b30 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b  tomatic rollback
16b40 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20   (as.    ** the 
16b50 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73  result of a cons
16b60 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29  traint, malloc()
16b70 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65   failure or IO e
16b80 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20  rror) then .    
16b90 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79  ** the cache may
16ba0 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69   be internally i
16bb0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74  nconsistent (not
16bc0 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74   contain valid t
16bd0 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20  rees) so.    ** 
16be0 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  we cannot simply
16bf0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
16c00 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  r to the caller.
16c10 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20   Instead, abort 
16c20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72  .    ** all quer
16c30 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ies that may be 
16c40 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65  using any of the
16c50 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61   cursors that fa
16c60 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20  iled to save..  
16c70 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
16c80 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
16c90 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a  ors(p, rc);.  }.
16ca0 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e  #endif.  btreeIn
16cb0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
16cc0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
16cd0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
16ce0 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
16cf0 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
16d00 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
16d10 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
16d20 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
16d30 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
16d40 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
16d50 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
16d60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
16d70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16d80 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
16d90 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
16da0 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
16db0 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
16dc0 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   ** call sqlite3
16dd0 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  BtreeGetPage() o
16de0 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
16df0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
16e00 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
16e10 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
16e20 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  y. */.    if( sq
16e30 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
16e40 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
16e50 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
16e60 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
16e70 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
16e80 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
16e90 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
16ea0 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20  rs(pBt)==0 );.  
16eb0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
16ec0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
16ed0 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  D;.  }..  if( p-
16ee0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
16ef0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 63 6c 65 61  NONE ){.    clea
16f00 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
16f10 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
16f20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
16f30 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
16f40 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
16f50 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
16f60 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
16f70 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
16f80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
16f90 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
16fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74  .    }.  }..  bt
16fb0 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
16fc0 6e 74 28 70 42 74 29 3b 0a 20 20 70 2d 3e 69 6e  nt(pBt);.  p->in
16fd0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
16fe0 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65  NE;.  unlockBtre
16ff0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
17000 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
17010 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
17020 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17030 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17040 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
17050 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
17060 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
17070 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e  nsaction can can
17080 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
17090 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
170a0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
170b0 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
170c0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
170d0 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
170e0 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
170f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
17100 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
17110 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
17120 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
17130 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
17140 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
17150 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
17160 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
17170 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
17180 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
17190 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
171a0 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
171b0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
171c0 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
171d0 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
171e0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
171f0 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
17200 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
17210 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
17220 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
17230 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
17240 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
17250 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
17260 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
17270 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
17280 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
17290 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
172a0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
172b0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
172c0 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
172d0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
172e0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
172f0 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
17300 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
17310 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
17320 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
17330 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
17340 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
17350 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
17360 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
17370 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
17380 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
17390 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
173a0 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
173b0 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
173c0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
173d0 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
173e0 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
173f0 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
17400 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
17410 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
17420 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17430 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
17440 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
17450 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
17460 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
17470 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17480 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17490 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
174a0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
174b0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
174c0 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e  ert( pBt->readOn
174d0 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ly==0 );.  asser
174e0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
174f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
17500 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
17510 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69  Savepoint );.  i
17520 66 28 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72  f( NEVER(p->inTr
17530 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
17540 20 7c 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c   || pBt->readOnl
17550 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  y) ){.    rc = S
17560 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a  QLITE_INTERNAL;.
17570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
17580 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
17590 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
175a0 52 49 54 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41  RITE );.    /* A
175b0 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
175c0 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
175d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
175e0 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
175f0 20 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67     ** an index g
17600 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
17610 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
17620 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
17630 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73  ing.    ** SQL s
17640 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73  tatements. It is
17650 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e   illegal to open
17660 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
17670 6c 62 61 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a  lback any.    **
17680 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
17690 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
176a0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
176b0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
176c0 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
176d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
176e0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
176f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
17700 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  atement);.  }.  
17710 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17720 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17730 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
17740 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
17750 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
17760 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
17770 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
17780 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
17790 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
177a0 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
177b0 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
177c0 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
177d0 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
177e0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
177f0 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
17800 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
17810 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
17820 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
17830 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
17840 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
17850 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
17860 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
17870 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
17880 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
17890 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
178a0 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
178b0 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
178c0 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
178d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
178e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
178f0 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
17900 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
17910 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
17920 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
17930 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
17940 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
17950 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
17960 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
17970 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
17980 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
17990 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
179a0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
179b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
179c0 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
179d0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
179e0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
179f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
17a00 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
17a10 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
17a20 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
17a30 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
17a40 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
17a50 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
17a60 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
17a70 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
17a80 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
17a90 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17aa0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17ab0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
17ac0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
17ad0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
17ae0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
17b00 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
17b10 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
17b20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17b30 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
17b40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
17b50 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
17b60 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
17b70 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
17b80 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
17b90 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66  ble.  The act of
17ba0 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72   acquiring a cur
17bb0 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20  sor gets a read 
17bc0 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
17bd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
17be0 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
17bf0 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
17c00 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
17c10 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
17c20 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
17c30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
17c40 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
17c50 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
17c60 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
17c70 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
17c80 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
17c90 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
17ca0 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
17cb0 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
17cc0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
17cd0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
17ce0 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
17cf0 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
17d00 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
17d10 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
17d20 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
17d30 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
17d40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
17d50 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
17d60 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
17d70 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
17d80 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
17d90 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
17da0 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
17db0 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
17dc0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
17dd0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
17de0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
17df0 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
17e00 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
17e10 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
17e20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
17e30 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
17e40 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
17e50 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
17e60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
17e70 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
17e80 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
17e90 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
17ea0 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
17eb0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
17ec0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
17ed0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
17ee0 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
17ef0 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
17f00 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
17f10 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
17f20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
17f30 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
17f40 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
17f50 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
17f60 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
17f70 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
17f80 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
17f90 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
17fa0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
17fb0 72 53 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66  rSize() bytes of
17fc0 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e   memory .** poin
17fd0 74 65 64 20 74 6f 20 62 79 20 70 43 75 72 20 68  ted to by pCur h
17fe0 61 76 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20  ave been zeroed 
17ff0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
18000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
18010 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
18020 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
18050 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18080 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
18090 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
180a0 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180c0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
180d0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
180e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
180f0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18110 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d  First arg to com
18120 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
18130 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
18140 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18160 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75  Space for new cu
18170 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rsor */.){.  int
18180 20 72 63 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67   rc;.  Pgno nPag
18190 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
181a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
181b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
181c0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
181d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
181e0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
181f0 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 77  ag==1 );.  if( w
18200 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 73 73  rFlag ){.    ass
18210 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
18220 6e 6c 79 20 29 3b 0a 20 20 20 20 69 66 28 20 4e  nly );.    if( N
18230 45 56 45 52 28 70 42 74 2d 3e 72 65 61 64 4f 6e  EVER(pBt->readOn
18240 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ly) ){.      ret
18250 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
18260 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  NLY;.    }.    r
18270 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64  c = checkForRead
18280 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
18290 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ble, 0, 0);.    
182a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
182b0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
182c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f  t( rc==SQLITE_LO
182d0 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
182e0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
182f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
18300 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
18310 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  1==0 ){.    rc =
18320 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
18330 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  try(p);.    if( 
18340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18350 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
18370 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
18380 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72  Pgno)iTable;.  r
18390 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
183a0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
183b0 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e  Pager, (int *)&n
183c0 50 61 67 65 29 3b 20 0a 20 20 69 66 28 20 72 63  Page); .  if( rc
183d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
183e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
183f0 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
18400 31 20 26 26 20 6e 50 61 67 65 3d 3d 30 20 29 7b  1 && nPage==0 ){
18410 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18420 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f  _EMPTY;.    goto
18430 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
18440 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  xception;.  }.  
18450 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
18460 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
18470 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
18480 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66  apPage[0]);.  if
18490 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
184a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  ){.    goto crea
184b0 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
184c0 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ion;.  }..  /* N
184d0 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
184e0 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
184f0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
18500 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
18510 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
18520 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  , link the curso
18530 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
18540 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74  red list and set
18550 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a   *ppCur (the.  *
18560 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e  * output argumen
18570 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
18580 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  on)..  */.  pCur
18590 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
185a0 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
185b0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
185c0 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
185d0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28  pCur->wrFlag = (
185e0 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75  u8)wrFlag;.  pCu
185f0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
18600 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
18610 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
18620 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
18630 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
18640 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
18650 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
18660 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
18670 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d  INVALID;.  pCur-
18680 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30  >cachedRowid = 0
18690 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
186a0 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63  TE_OK;..create_c
186b0 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a  ursor_exception:
186c0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
186d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b  Cur->apPage[0]);
186e0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
186f0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72  Unused(pBt);.  r
18700 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
18710 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
18720 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
18760 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
18770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18790 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
187a0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
187b0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
187e0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
187f0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
18800 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
18810 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
18820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
18830 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
18840 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
18850 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
18860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18870 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
18880 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
18890 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
188a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
188b0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
188c0 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
188d0 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
188e0 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
188f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18900 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18910 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
18920 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
18930 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
18940 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
18950 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
18960 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
18970 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
18980 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
18990 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
189a0 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
189b0 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
189c0 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
189d0 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
189e0 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
189f0 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
18a00 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
18a10 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
18a20 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
18a30 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
18a40 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
18a50 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
18a60 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  n sizeof(BtCurso
18a70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  r);.}../*.** Set
18a80 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69   the cached rowi
18a90 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  d value of every
18aa0 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73   cursor in the s
18ab0 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
18ac0 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64  e.** as pCur and
18ad0 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65   having the same
18ae0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
18af0 72 20 61 73 20 70 43 75 72 2e 20 20 54 68 65 20  r as pCur.  The 
18b00 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20  value is.** set 
18b10 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a  to iRowid..**.**
18b20 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72   Only positive r
18b30 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72 65 20  owid values are 
18b40 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64  considered valid
18b50 20 66 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e   for this cache.
18b60 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69 73  .** The cache is
18b70 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
18b80 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67  zero, indicating
18b90 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68   an invalid cach
18ba0 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69  e..** A btree wi
18bb0 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74  ll work fine wit
18bc0 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  h zero or negati
18bd0 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a  ve rowids.  We j
18be0 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61  ust cannot.** ca
18bf0 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61  che zero or nega
18c00 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69  tive rowids, whi
18c10 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20  ch means tables 
18c20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72  that use zero or
18c30 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77  .** negative row
18c40 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ids might run a 
18c50 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
18c60 42 75 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c  But in practice,
18c70 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61   zero.** or nega
18c80 74 69 76 65 20 72 6f 77 69 64 73 20 61 72 65 20  tive rowids are 
18c90 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f  very uncommon so
18ca0 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
18cb0 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a   be a problem..*
18cc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
18cd0 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 69  reeSetCachedRowi
18ce0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
18cf0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
18d00 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72  iRowid){.  BtCur
18d10 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
18d20 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73  pCur->pBt->pCurs
18d30 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
18d40 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  t){.    if( p->p
18d50 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70  gnoRoot==pCur->p
18d60 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63  gnoRoot ) p->cac
18d70 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  hedRowid = iRowi
18d80 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
18d90 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
18da0 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a  id==iRowid );.}.
18db0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18dc0 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 66  e cached rowid f
18dd0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
18de0 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65  sor.  A negative
18df0 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75   or zero.** retu
18e00 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
18e10 65 73 20 74 68 61 74 20 74 68 65 20 72 6f 77 69  es that the rowi
18e20 64 20 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c  d cache is inval
18e30 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
18e40 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66  .** ignored.  If
18e50 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
18e60 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72   has never befor
18e70 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e  e been set, then
18e80 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65   a.** zero is re
18e90 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74  turned..*/.sqlit
18ea0 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
18eb0 42 74 72 65 65 47 65 74 43 61 63 68 65 64 52 6f  BtreeGetCachedRo
18ec0 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
18ed0 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
18ee0 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b  ur->cachedRowid;
18ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
18f00 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
18f10 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
18f20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
18f30 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
18f40 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
18f50 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
18f60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18f70 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
18f80 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
18f90 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
18fa0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
18fb0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
18fc0 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
18fd0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
18fe0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
18ff0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
19000 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
19010 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
19020 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  r(pCur);.    if(
19030 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a   pCur->pPrev ){.
19040 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65        pCur->pPre
19050 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
19060 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
19070 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  e{.      pBt->pC
19080 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
19090 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
190a0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
190b0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e  {.      pCur->pN
190c0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
190d0 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a  r->pPrev;.    }.
190e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
190f0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
19100 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
19110 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
19120 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
19130 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
19140 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69  used(pBt);.    i
19150 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
19160 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20  wCache(pCur);.  
19170 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
19180 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
19190 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
191a0 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
191b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
191c0 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
191d0 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 4d  ITE_TEST./*.** M
191e0 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
191f0 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
19200 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
19210 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
19220 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
19230 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
19240 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
19250 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
19260 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
19270 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
19280 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19290 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43  BtCursor *pTempC
192a0 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
192b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
192c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
192d0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70  ;.  memcpy(pTemp
192e0 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f  Cur, pCur, sizeo
192f0 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20 20  f(BtCursor));.  
19300 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20  pTempCur->pNext 
19310 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  = 0;.  pTempCur-
19320 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66 6f  >pPrev = 0;.  fo
19330 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70 43  r(i=0; i<=pTempC
19340 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
19350 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
19360 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 61  rRef(pTempCur->a
19370 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67  pPage[i]->pDbPag
19380 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
19390 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65 79  ( pTempCur->pKey
193a0 3d 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ==0 );.}.#endif 
193b0 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
193c0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
193d0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  _TEST./*.** Dele
193e0 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  te a temporary c
193f0 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61  ursor such as wa
19400 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72  s made by the Cr
19410 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72  eateTemporaryCur
19420 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  sor().** functio
19430 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64  n above..*/.void
19440 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c   sqlite3BtreeRel
19450 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42  easeTempCursor(B
19460 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19470 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
19480 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
19490 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66  tex(pCur) );.  f
194a0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
194b0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
194c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
194d0 72 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ref(pCur->apPage
194e0 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  [i]->pDbPage);. 
194f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
19500 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d  e(pCur->pKey);.}
19510 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19520 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  E_TEST */../*.**
19530 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
19540 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
19550 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
19560 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
19570 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
19580 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
19590 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
195a0 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69  id, call.** sqli
195b0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
195c0 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
195d0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
195e0 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
195f0 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
19600 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
19610 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
19620 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
19630 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
19640 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   of calls to sql
19650 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
19660 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
19670 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
19680 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
19690 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
196a0 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
196b0 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
196c0 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
196d0 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
196e0 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
196f0 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
19700 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
19710 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
19720 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
19730 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
19740 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
19750 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
19760 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
19770 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
19780 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
19790 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
197a0 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
197b0 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
197c0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
197d0 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
197e0 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
197f0 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
19800 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
19810 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
19820 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
19830 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
19840 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
19850 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
19860 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
19870 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
19880 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
19890 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71  f(info));.    sq
198a0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
198b0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
198c0 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  [iPage], pCur->a
198d0 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e  iIdx[iPage], &in
198e0 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
198f0 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
19900 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
19910 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
19920 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
19930 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
19940 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66  fo(x).#endif.#if
19950 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f  def _MSC_VER.  /
19960 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e  * Use a real fun
19970 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f  ction in MSVC to
19980 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   work around bug
19990 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c  s in that compil
199a0 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  er. */.  static 
199b0 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
199c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
199d0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
199e0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
199f0 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65  .      int iPage
19a00 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
19a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19a20 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
19a30 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
19a40 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
19a50 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
19a60 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  .      pCur->val
19a70 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
19a80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
19a90 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
19aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
19ab0 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53  se /* if not _MS
19ac0 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73  C_VER */.  /* Us
19ad0 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c  e a macro in all
19ae0 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73   other compilers
19af0 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e   so that the fun
19b00 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64  ction is inlined
19b10 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43   */.#define getC
19b20 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20  ellInfo(pCur)   
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d     \.  if( pCur-
19b70 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
19b80 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bb0 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50      \.    int iP
19bc0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
19bd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c00 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74       \.    sqlit
19c10 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
19c20 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
19c30 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
19c40 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
19c50 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72  nfo); \.    pCur
19c60 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
19cb0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
19d00 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
19d10 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
19d50 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
19d60 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  R */../*.** Set 
19d70 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
19d80 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
19d90 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
19da0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
19db0 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
19dc0 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
19dd0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
19de0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
19df0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
19e00 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
19e10 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
19e20 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
19e30 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
19e40 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
19e50 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
19e60 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
19e70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19e80 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
19e90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19ea0 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
19eb0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
19ec0 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
19ed0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
19ee0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
19ef0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
19f00 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
19f10 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
19f20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19f30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
19f40 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19f50 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
19f60 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19f70 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
19f80 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
19f90 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
19fa0 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
19fb0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
19fc0 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
19fd0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
19fe0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
19ff0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a  nfo.nKey;.    }.
1a000 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
1a020 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
1a030 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1a040 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
1a050 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
1a060 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1a070 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  to.  Always retu
1a080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
1a090 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
1a0a0 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68  possible.  If th
1a0b0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
1a0c0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
1a0d0 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72  nting to an entr
1a0e0 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  y (which can hap
1a0f0 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
1a100 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  , if.** the data
1a110 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74  base is empty) t
1a120 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65  hen *pSize is se
1a130 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  t to 0..*/.int s
1a140 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
1a150 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1a160 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
1a170 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a180 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a190 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a1a0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1a1b0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1a1c0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1a1d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1a1e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1a1f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1a200 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
1a210 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1a220 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
1a230 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a240 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1a250 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69     /* Not pointi
1a260 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e  ng at a valid en
1a270 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65  try - set *pSize
1a280 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20   to 0. */.      
1a290 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
1a2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
1a2b0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1a2c0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
1a2d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b  Cur->info.nData;
1a2e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a2f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a300 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
1a310 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
1a320 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1a330 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
1a340 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
1a350 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
1a360 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
1a370 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1a380 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
1a390 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
1a3a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
1a3b0 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
1a3c0 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
1a3d0 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
1a3e0 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
1a3f0 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
1a400 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
1a410 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
1a420 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1a430 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
1a440 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1a450 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1a460 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ise:.**.** The p
1a470 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1a480 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
1a490 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
1a4a0 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77  ed list is .** w
1a4b0 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
1a4c0 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
1a4d0 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  fl is the last p
1a4e0 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65  age in its linke
1a4f0 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67  d .** list, *pPg
1a500 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
1a510 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
1a520 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
1a530 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72  ULL, and a refer
1a540 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50  ence to the MemP
1a550 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  age object corre
1a560 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
1a570 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c  age number pOvfl
1a580 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74   was obtained, t
1a590 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73  hen *ppPage is s
1a5a0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1a5b0 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  hat.** reference
1a5c0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
1a5d0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1a5e0 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c  e caller to call
1a5f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a   releasePage().*
1a600 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20  * on *ppPage to 
1a610 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e  free the referen
1a620 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65  ce. In no refere
1a630 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64  nce was obtained
1a640 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1a650 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73   pointer-map was
1a660 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
1a670 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70  the value for *p
1a680 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a  PgnoNext), then.
1a690 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ** *ppPage is se
1a6a0 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  t to zero..*/.st
1a6b0 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
1a6c0 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
1a6d0 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67  ared *pBt, .  Pg
1a6e0 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
1a6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76             /* Ov
1a700 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20  erflow page */. 
1a710 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
1a720 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
1a730 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
1a740 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
1a750 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
1a760 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
1a770 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
1a780 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1a790 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
1a7a0 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
1a7b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1a7c0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
1a7d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
1a7e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a7f0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1a800 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1a810 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
1a820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a830 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
1a840 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
1a850 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1a860 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
1a870 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
1a880 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
1a890 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
1a8a0 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
1a8b0 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
1a8c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
1a8d0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
1a8e0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
1a8f0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
1a900 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
1a910 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
1a920 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
1a930 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
1a940 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
1a950 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
1a960 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
1a970 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
1a980 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1a990 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
1a9a0 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
1a9b0 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
1a9c0 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
1a9d0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1a9e0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
1a9f0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
1aa00 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1aa10 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
1aa20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1aa30 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67  iGuess<=pagerPag
1aa40 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
1aa50 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
1aa60 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
1aa70 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
1aa80 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1aa90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
1aaa0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1aab0 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
1aac0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
1aad0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
1aae0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1aaf0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
1ab00 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1ab10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ab20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1ab30 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
1ab40 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
1ab50 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61  pPage, 0);.    a
1ab60 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
1ab70 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29  _OK || pPage==0)
1ab80 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d  ;.    if( next==
1ab90 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
1aba0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
1abb0 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
1abc0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
1abd0 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
1abe0 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
1abf0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
1ac00 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
1ac10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
1ac20 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1ac30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
1ac40 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
1ac50 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
1ac60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
1ac70 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1ac80 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
1ac90 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
1aca0 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
1acb0 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
1acc0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
1acd0 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
1ace0 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
1acf0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
1ad00 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
1ad10 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
1ad20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
1ad30 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
1ad40 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
1ad50 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
1ad60 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
1ad70 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
1ad80 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
1ad90 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
1ada0 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
1adb0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
1adc0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
1add0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
1ade0 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
1adf0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1ae00 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1ae10 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
1ae20 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1ae30 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
1ae40 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
1ae50 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
1ae60 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ae70 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
1ae80 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1ae90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1aea0 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
1aeb0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aed0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1aee0 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
1aef0 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
1af00 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
1af10 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
1af20 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
1af30 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
1af40 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
1af50 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
1af60 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
1af70 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
1af80 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
1af90 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
1afa0 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
1afb0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1afc0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1afd0 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
1afe0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1aff0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b000 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b010 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
1b020 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
1b030 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
1b040 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1b050 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
1b060 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
1b070 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1b080 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
1b090 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
1b0a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1b0b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b0c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1b0d0 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
1b0e0 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
1b0f0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
1b100 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
1b110 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
1b120 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1b130 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70  g to. If the eOp
1b140 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
1b150 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65   0, this is a re
1b160 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61  ad operation (da
1b170 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a  ta copied into.*
1b180 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20  * buffer pBuf). 
1b190 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  If it is non-zer
1b1a0 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61  o, a write (data
1b1b0 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20   copied from.** 
1b1c0 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a  buffer pBuf)..**
1b1d0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
1b1e0 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
1b1f0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
1b200 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
1b210 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
1b220 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
1b230 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1b240 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b250 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  tine does not ma
1b260 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e  ke a distinction
1b270 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64   between key and
1b280 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73   data..** It jus
1b290 74 20 72 65 61 64 73 20 6f 72 20 77 72 69 74 65  t reads or write
1b2a0 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  s bytes from the
1b2b0 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20   payload area.  
1b2c0 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61  Data might .** a
1b2d0 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69  ppear on the mai
1b2e0 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73 63 61  n page or be sca
1b2f0 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
1b300 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
1b310 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  .** pages..**.**
1b320 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
1b330 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  .isIncrblobHandl
1b340 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  e flag is set, a
1b350 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  nd the current.*
1b360 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  * cursor entry u
1b370 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
1b380 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1b390 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
1b3a0 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65   allocates space
1b3b0 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
1b3c0 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76  popluates the ov
1b3d0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1b3e0 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79   .** cache array
1b3f0 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
1b400 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e  flow). Subsequen
1b410 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
1b420 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  .** cache to mak
1b430 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
1b440 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
1b450 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
1b460 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
1b470 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1b480 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
1b490 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
1b4a0 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
1b4b0 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
1b4c0 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
1b4d0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
1b4e0 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
1b4f0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
1b500 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
1b510 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
1b520 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
1b530 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
1b540 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
1b550 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
1b560 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
1b570 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
1b580 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
1b590 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
1b5a0 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
1b5b0 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
1b5c0 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
1b5d0 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
1b5e0 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
1b5f0 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
1b600 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
1b610 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
1b620 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
1b630 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
1b640 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1b650 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
1b660 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
1b670 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
1b680 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
1b690 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
1b6a0 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
1b6b0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
1b6c0 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
1b6d0 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
1b6e0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
1b6f0 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
1b700 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
1b710 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
1b720 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20  skipKey,        
1b730 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e   /* offset begin
1b740 73 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  s at data if thi
1b750 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  s is true */.  i
1b760 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20  nt eOp          
1b770 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72      /* zero to r
1b780 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  ead. non-zero to
1b790 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20   write. */.){.  
1b7a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1b7b0 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72  Payload;.  int r
1b7c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b7d0 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   u32 nKey;.  int
1b7e0 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d   iIdx = 0;.  Mem
1b7f0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
1b800 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1b810 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65  >iPage]; /* Btre
1b820 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e  e page of curren
1b830 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53  t entry */.  BtS
1b840 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
1b850 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  r->pBt;         
1b860 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
1b870 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65  e this cursor be
1b880 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
1b890 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
1b8a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b8b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1b8c0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1b8d0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1b8e0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1b8f0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
1b900 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1b910 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
1b920 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1b930 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
1b940 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
1b950 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ll + pCur->info.
1b960 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20  nHeader;.  nKey 
1b970 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  = (pPage->intKey
1b980 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72   ? 0 : (int)pCur
1b990 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20  ->info.nKey);.. 
1b9a0 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
1b9b0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b      offset += nK
1b9c0 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66  ey;.  }.  if( of
1b9d0 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b  fset+amt > nKey+
1b9e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
1b9f0 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
1ba00 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1ba10 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
1ba20 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
1ba30 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
1ba40 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
1ba50 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
1ba60 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
1ba70 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
1ba80 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1ba90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1baa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1bab0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
1bac0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
1bad0 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
1bae0 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
1baf0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
1bb00 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1bb10 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
1bb20 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
1bb30 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
1bb40 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
1bb50 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
1bb60 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
1bb70 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
1bb80 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
1bb90 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
1bba0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
1bbb0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1bbc0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
1bbd0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
1bbe0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
1bbf0 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
1bc00 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1bc10 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  al;.  }..  if( r
1bc20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bc30 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
1bc40 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
1bc50 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1bc60 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
1bc70 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
1bc80 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
1bc90 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
1bca0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1bcb0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
1bcc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1bcd0 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
1bce0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1bcf0 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
1bd00 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
1bd10 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
1bd20 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
1bd30 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
1bd40 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
1bd50 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
1bd60 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
1bd70 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
1bd80 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
1bd90 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
1bda0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1bdb0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
1bdc0 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
1bdd0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
1bde0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
1bdf0 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
1be00 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
1be10 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
1be20 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
1be30 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
1be40 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
1be50 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
1be60 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
1be70 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
1be80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
1be90 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
1bea0 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
1beb0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1bec0 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
1bed0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
1bee0 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
1bef0 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
1bf00 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
1bf10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
1bf20 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
1bf30 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
1bf40 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
1bf50 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20        if( nOvfl 
1bf60 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
1bf70 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
1bf80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1bf90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bfa0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
1bfb0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1bfc0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
1bfd0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
1bfe0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
1bff0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
1c000 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
1c010 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
1c020 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
1c030 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
1c040 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1c050 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
1c060 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
1c070 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
1c080 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
1c090 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
1c0a0 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
1c0b0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
1c0c0 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
1c0d0 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
1c0e0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
1c0f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
1c100 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
1c110 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
1c120 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
1c130 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c140 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1c150 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
1c160 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
1c170 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1c180 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
1c190 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
1c1a0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1c1b0 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
1c1c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1c1d0 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
1c1e0 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
1c1f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
1c200 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1c210 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
1c220 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1c230 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
1c240 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
1c250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
1c260 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
1c270 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
1c280 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
1c290 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
1c2a0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
1c2b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1c2c0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
1c2d0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1c2e0 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
1c2f0 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
1c300 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
1c310 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
1c320 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
1c330 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
1c340 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
1c350 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
1c360 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
1c370 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
1c380 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
1c390 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1c3a0 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
1c3b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1c3c0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
1c3d0 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
1c3e0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
1c3f0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
1c400 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
1c410 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
1c420 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
1c430 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
1c440 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
1c450 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
1c460 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
1c470 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
1c480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c490 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
1c4a0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
1c4b0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
1c4c0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
1c4d0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
1c4e0 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
1c4f0 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
1c500 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
1c510 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
1c520 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65  /.        DbPage
1c530 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
1c540 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
1c550 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c560 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
1c570 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
1c580 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ge, &pDbPage);. 
1c590 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1c5a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c5b0 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
1c5c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1c5d0 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
1c5e0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
1c5f0 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
1c600 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
1c610 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
1c620 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
1c630 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f             a = o
1c640 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
1c650 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c660 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
1c670 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1c680 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
1c690 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
1c6a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1c6b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1c6c0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
1c6d0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
1c6e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20  ;.          amt 
1c6f0 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20  -= a;.          
1c700 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
1c710 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c720 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
1c730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
1c740 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
1c750 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1c760 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
1c770 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c780 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
1c790 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
1c7a0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
1c7b0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
1c7c0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
1c7d0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
1c7e0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
1c7f0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
1c800 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
1c810 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1c820 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1c830 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
1c840 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
1c850 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
1c860 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
1c870 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
1c880 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
1c890 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
1c8a0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
1c8b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c8c0 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
1c8d0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
1c8e0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
1c8f0 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
1c900 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1c910 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1c920 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1c930 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1c940 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1c950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c960 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1c970 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1c980 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
1c990 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
1c9a0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
1c9b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1c9c0 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  e] );.    if( pC
1c9d0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
1c9e0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
1c9f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1ca00 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1ca10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1ca20 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1ca30 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
1ca40 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1ca50 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
1ca60 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
1ca70 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
1ca80 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
1ca90 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b  ar*)pBuf, 0, 0);
1caa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1cab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1cac0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
1cad0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1cae0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
1caf0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
1cb00 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
1cb10 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
1cb20 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
1cb30 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
1cb40 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
1cb50 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1cb60 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
1cb70 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
1cb80 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
1cb90 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
1cba0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
1cbb0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
1cbc0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
1cbd0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
1cbe0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
1cbf0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
1cc00 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1cc10 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
1cc20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
1cc30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
1cc40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cc50 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28  _INCRBLOB.  if (
1cc60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1cc70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1cc80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1cc90 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
1cca0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1ccb0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1ccc0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1ccd0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1cce0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1ccf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cd00 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1cd10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1cd20 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1cd30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1cd40 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
1cd50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1cd60 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73  iPage] );.    as
1cd70 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1cd80 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1cd90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1cda0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
1cdb0 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
1cdc0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
1cdd0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
1cde0 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  f, 1, 0);.  }.  
1cdf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ce00 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1ce10 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
1ce20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1ce30 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1ce40 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
1ce50 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1ce60 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
1ce70 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
1ce80 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
1ce90 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30  ey if skipKey==0
1cea0 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74   and it points t
1ceb0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1cec0 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b  of data if.** sk
1ced0 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e  ipKey==1.  The n
1cee0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1cef0 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f  f available key/
1cf00 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a  data is written.
1cf10 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  ** into *pAmt.  
1cf20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
1cf30 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
1cf40 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
1cf50 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e  .** a valid poin
1cf60 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
1cf70 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
1cf80 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
1cf90 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
1cfa0 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
1cfb0 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
1cfc0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
1cfd0 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
1cfe0 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
1cff0 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
1d000 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
1d010 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
1d020 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
1d030 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
1d040 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
1d050 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
1d060 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
1d070 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
1d080 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1d090 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
1d0a0 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
1d0b0 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
1d0c0 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
1d0d0 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
1d0e0 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
1d0f0 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
1d100 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
1d110 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
1d120 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
1d130 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
1d140 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
1d150 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1d160 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
1d170 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
1d180 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
1d190 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
1d1a0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
1d1b0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
1d1c0 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50  ned char *fetchP
1d1d0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
1d1e0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
1d1f0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1d200 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
1d210 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
1d220 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20   *pAmt,         
1d230 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
1d240 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1d250 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
1d260 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20  .  int skipKey  
1d270 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20          /* read 
1d280 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74  beginning at dat
1d290 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
1d2a0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
1d2b0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
1d2c0 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d;.  MemPage *pP
1d2d0 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  age;.  u32 nKey;
1d2e0 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a  .  u32 nLocal;..
1d2f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
1d300 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  0 && pCur->iPage
1d310 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1d320 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1d330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d340 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1d350 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1d360 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1d370 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1d380 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
1d390 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1d3a0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  e];.  assert( pC
1d3b0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1d3c0 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
1d3d0 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ell );.  getCell
1d3e0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
1d3f0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
1d400 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
1d410 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
1d420 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
1d430 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1d440 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
1d450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1d460 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  Key = (int)pCur-
1d470 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
1d480 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
1d490 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
1d4a0 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
1d4b0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
1d4c0 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
1d4d0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
1d4e0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
1d4f0 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e  Local;.    if( n
1d500 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20  Local>nKey ){.  
1d510 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65      nLocal = nKe
1d520 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  y;.    }.  }.  *
1d530 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  pAmt = nLocal;. 
1d540 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64   return aPayload
1d550 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
1d560 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
1d570 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
1d580 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
1d590 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
1d5a0 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
1d5b0 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
1d5c0 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
1d5d0 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
1d5e0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
1d5f0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
1d600 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
1d610 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
1d620 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
1d630 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
1d640 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
1d650 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
1d660 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
1d670 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
1d680 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
1d690 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
1d6a0 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
1d6b0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
1d6c0 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
1d6d0 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
1d6e0 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
1d6f0 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
1d700 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
1d710 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
1d720 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
1d730 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
1d740 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
1d750 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
1d760 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1d770 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
1d780 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
1d790 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
1d7a0 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
1d7b0 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
1d7c0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1d7d0 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Amt){.  assert( 
1d7e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1d7f0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1d800 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1d810 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1d820 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1d830 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1d840 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1d850 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1d860 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1d870 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1d880 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
1d890 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f    return 0;.}.co
1d8a0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1d8b0 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
1d8c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d8d0 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
1d8e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1d8f0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1d900 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1d910 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
1d920 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1d930 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
1d940 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1d950 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
1d960 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
1d970 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
1d980 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29  d(pCur, pAmt, 1)
1d990 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1d9a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1d9b0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1d9c0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
1d9d0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
1d9e0 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
1d9f0 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
1da00 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
1da10 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
1da20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1da30 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
1da40 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
1da50 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
1da60 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
1da70 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
1da80 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
1da90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1daa0 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
1dab0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1dac0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1dad0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1dae0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1daf0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1db00 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
1db10 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
1db20 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1db30 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
1db40 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
1db50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1db60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1db70 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
1db80 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1db90 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
1dba0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1dbb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
1dbc0 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
1dbd0 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
1dbe0 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
1dbf0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
1dc00 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
1dc10 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1dc20 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1dc30 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
1dc40 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20  ge->nCell<1 ){. 
1dc50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1dc60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1dc70 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1dc80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1dc90 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  f NDEBUG./*.** P
1dca0 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
1dcb0 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
1dcc0 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
1dcd0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
1dce0 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
1dcf0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
1dd00 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
1dd10 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
1dd20 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
1dd30 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
1dd40 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
1dd50 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
1dd60 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
1dd70 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
1dd80 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
1dd90 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
1dda0 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
1ddb0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
1ddc0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
1ddd0 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
1dde0 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
1ddf0 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
1de00 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49  d){.  assert( iI
1de10 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
1de20 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
1de30 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
1de40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1de50 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
1de60 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
1de70 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
1de80 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
1de90 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1dea0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1deb0 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
1dec0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
1ded0 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
1dee0 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
1def0 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
1df00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
1df10 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
1df20 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
1df30 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
1df40 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1df50 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
1df60 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
1df70 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
1df80 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
1df90 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
1dfa0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
1dfb0 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
1dfc0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
1dfd0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
1dfe0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
1dff0 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
1e000 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
1e010 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1e020 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  eeMoveToParent(B
1e030 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1e040 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1e050 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1e060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1e070 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1e080 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1e090 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1e0a0 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
1e0b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1e0c0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1e0d0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1e0e0 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
1e0f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
1e100 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
1e110 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1e120 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
1e130 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e140 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
1e150 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1e160 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1e170 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
1e180 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
1e190 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1e1a0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1e1b0 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
1e1c0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1e1d0 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
1e1e0 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
1e1f0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
1e200 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
1e210 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
1e220 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e230 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  _OK;.  Btree *p 
1e240 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1e250 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1e260 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
1e270 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e280 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1e290 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1e2a0 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
1e2b0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1e2c0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1e2d0 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
1e2e0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1e2f0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1e300 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
1e310 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1e320 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1e330 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
1e340 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
1e350 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1e360 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
1e370 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1e380 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d  Cur->skip;.    }
1e390 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e3a0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
1e3b0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
1e3c0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
1e3d0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1e3e0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72  for(i=1; i<=pCur
1e3f0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1e400 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e410 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1e420 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1e430 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20  {.    if( .     
1e440 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
1e450 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
1e460 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
1e470 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
1e480 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a  age[0])).    ){.
1e490 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1e4a0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1e4b0 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
1e4c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1e4d0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
1e4e0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
1e4f0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1e500 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
1e510 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  t );.  pCur->iPa
1e520 67 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ge = 0;.  pCur->
1e530 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
1e540 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1e550 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
1e560 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
1e570 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1e580 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ..  if( pRoot->n
1e590 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
1e5a0 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
1e5b0 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
1e5c0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
1e5d0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
1e5e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e5f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
1e600 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  oot->pgno==1 );.
1e610 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
1e620 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
1e630 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
1e640 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
1e650 73 73 65 72 74 28 20 73 75 62 70 61 67 65 3e 30  ssert( subpage>0
1e660 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   );.    pCur->eS
1e670 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
1e680 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
1e690 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1e6a0 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
1e6b0 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
1e6c0 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e  ate = ((pRoot->n
1e6d0 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
1e6e0 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
1e6f0 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LID);.  }.  retu
1e700 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e710 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1e720 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
1e730 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
1e740 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
1e750 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
1e760 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1e770 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
1e780 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
1e790 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
1e7a0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
1e7b0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
1e7c0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
1e7d0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1e7e0 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
1e7f0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1e800 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
1e810 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e820 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
1e830 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
1e840 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1e850 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1e860 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1e870 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1e880 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
1e890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e8a0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
1e8b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e8c0 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
1e8d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e8e0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1e8f0 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
1e900 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
1e910 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1e920 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
1e930 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
1e940 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
1e950 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1e960 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
1e970 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1e980 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1e990 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
1e9a0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
1e9b0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
1e9c0 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
1e9d0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1e9e0 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
1e9f0 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
1ea00 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
1ea10 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
1ea20 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
1ea30 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
1ea40 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
1ea50 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
1ea60 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
1ea70 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
1ea80 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
1ea90 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
1eaa0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
1eab0 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
1eac0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
1ead0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
1eae0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
1eaf0 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
1eb00 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
1eb10 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
1eb20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1eb30 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1eb40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1eb50 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1eb60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1eb70 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
1eb80 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
1eb90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1eba0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ebb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1ebc0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ebd0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
1ebe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ebf0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
1ec00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ec10 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
1ec20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
1ec30 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1ec40 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1ec50 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
1ec60 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1ec70 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
1ec80 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
1ec90 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
1eca0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
1ecb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ecc0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
1ecd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
1ece0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
1ecf0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1ed00 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
1ed10 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1ed20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1ed30 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1ed40 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1ed50 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1ed60 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1ed70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1ed80 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
1ed90 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
1eda0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
1edb0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
1edc0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
1edd0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
1ede0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1edf0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1ee00 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
1ee10 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1ee20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1ee30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1ee40 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1ee50 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1ee60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1ee70 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1ee80 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1ee90 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
1eea0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
1eeb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1eec0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
1eed0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1eee0 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
1eef0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1ef00 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1ef10 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
1ef20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1ef30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ef40 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
1ef50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1ef60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1ef70 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
1ef80 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1ef90 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
1efa0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1efb0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
1efc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1efd0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1efe0 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
1eff0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1f000 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1f010 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1f020 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1f030 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1f040 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1f050 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1f060 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1f070 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1f080 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1f090 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
1f0a0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1f0b0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1f0c0 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
1f0d0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f0e0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f0f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f100 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1f110 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1f120 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
1f130 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
1f140 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
1f150 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
1f160 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
1f170 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
1f180 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1f190 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73  e && pCur->atLas
1f1a0 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  t ){.#ifdef SQLI
1f1b0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1f1c0 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
1f1d0 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
1f1e0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
1f1f0 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
1f200 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
1f210 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1f220 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
1f230 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
1f240 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
1f250 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
1f260 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1f270 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
1f280 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
1f290 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
1f2a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1f2b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1f2c0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
1f2d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1f2e0 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
1f2f0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1f300 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1f310 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
1f320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f330 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
1f340 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1f350 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1f360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1f370 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1f380 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1f390 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f3a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1f3b0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1f3c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
1f3d0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
1f3e0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1f3f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f400 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1f410 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1f420 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1f430 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1f440 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
1f450 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
1f460 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d  E_OK ?1:0;.    }
1f470 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f480 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1f490 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
1f4a0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
1f4b0 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
1f4c0 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
1f4d0 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
1f4e0 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
1f4f0 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
1f500 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
1f510 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
1f520 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1f530 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
1f540 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
1f550 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
1f560 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
1f570 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
1f580 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
1f590 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
1f5a0 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
1f5b0 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
1f5c0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
1f5d0 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
1f5e0 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
1f5f0 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
1f600 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
1f610 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
1f620 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
1f630 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
1f640 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
1f650 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
1f660 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
1f670 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
1f680 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
1f690 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
1f6a0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
1f6b0 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
1f6c0 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
1f6d0 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
1f6e0 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
1f6f0 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
1f700 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
1f710 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
1f720 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
1f730 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
1f740 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
1f750 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1f760 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1f770 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1f780 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
1f790 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
1f7a0 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
1f7b0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1f7c0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
1f7d0 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
1f7e0 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
1f7f0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
1f800 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
1f810 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
1f820 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1f830 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1f840 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1f850 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1f860 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
1f870 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
1f880 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
1f890 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
1f8a0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1f8b0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1f8c0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1f8d0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
1f8e0 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
1f8f0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
1f900 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f910 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
1f920 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1f930 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1f940 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
1f950 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
1f960 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
1f970 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
1f980 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
1f990 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
1f9a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
1f9b0 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
1f9c0 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
1f9d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1f9e0 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
1f9f0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
1fa00 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
1fa30 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
1fa40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1fa50 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1fa60 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1fa70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1fa80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1fa90 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1faa0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
1fab0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1fac0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
1fad0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
1fae0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
1faf0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
1fb00 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
1fb10 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
1fb20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
1fb30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1fb40 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
1fb50 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1fb60 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
1fb70 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
1fb80 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
1fb90 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
1fba0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
1fbb0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1fbc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fbd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1fbe0 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70  Cur->atLast && p
1fbf0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
1fc00 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
1fc10 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
1fc20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fc30 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1fc40 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1fc50 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
1fc60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1fc70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1fc80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fc90 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
1fca0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1fcb0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1fcc0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
1fcd0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1fce0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1fcf0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
1fd00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1fd10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1fd20 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
1fd30 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
1fd40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1fd50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1fd60 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
1fd70 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
1fd80 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
1fd90 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
1fda0 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
1fdb0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1fdc0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1fdd0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
1fde0 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a   int c = -1;  /*
1fdf0 20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20   pRes return if 
1fe00 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d  table is empty m
1fe10 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20  ust be -1 */.   
1fe20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
1fe30 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
1fe40 2d 31 3b 0a 20 20 20 20 69 66 28 20 28 21 70 50  -1;.    if( (!pP
1fe50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70  age->intKey && p
1fe60 49 64 78 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70  IdxKey==0) || up
1fe70 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  r<0 ){.      rc 
1fe80 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1fe90 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
1fea0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1feb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
1fec0 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
1fed0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1fee0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
1fef0 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  6)upr;.    }else
1ff00 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  {.      pCur->ai
1ff10 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1ff20 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77   = (u16)((upr+lw
1ff30 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
1ff40 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
1ff50 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
1ff60 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1ff70 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  e]; /* Index of 
1ff80 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
1ff90 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75  pPage */.      u
1ffa0 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffc0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1ffd0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
1ffe0 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20   pPage */..     
1fff0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
20000 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65  e = 0;.      pCe
20010 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
20020 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
20030 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
20040 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
20050 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
20060 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
20070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
20080 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
20090 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75            u32 du
200a0 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mmy;.          p
200b0 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e  Cell += getVarin
200c0 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79  t32(pCell, dummy
200d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
200e0 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
200f0 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
20100 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
20110 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  if( nCellKey==in
20120 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
20130 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
20140 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
20150 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
20160 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a          c = -1;.
20170 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20180 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
20190 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
201a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
201b0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
201c0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61          pCur->va
201d0 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
201e0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
201f0 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
20200 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20210 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
20220 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
20230 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36  age-size is 3276
20240 38 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  8 bytes. This me
20250 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
20260 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
20270 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
20280 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
20290 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
202a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
202b0 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38   is at most 8198
202c0 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61   bytes, which ma
202d0 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
202e0 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
202f0 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
20300 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
20310 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
20320 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
20330 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
20340 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
20350 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
20360 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
20370 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
20380 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
20390 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
203a0 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
203b0 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
203c0 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
203d0 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
203e0 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
203f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
20400 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
20410 20 20 20 20 20 20 20 69 66 28 20 21 28 6e 43 65         if( !(nCe
20420 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e 43  ll & 0x80) && nC
20430 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ell<=pPage->maxL
20440 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
20450 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
20460 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
20470 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
20480 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
20490 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
204a0 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
204b0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
204c0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
204d0 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
204e0 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
204f0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
20500 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
20510 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
20520 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
20530 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
20540 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
20550 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
20560 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
20570 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
20580 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
20590 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
205a0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
205b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
205c0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
205d0 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
205e0 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
205f0 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
20600 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
20610 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
20620 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
20630 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
20640 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
20650 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
20660 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
20670 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
20680 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20690 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
206a0 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
206b0 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
206c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
206d0 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
206e0 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
206f0 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
20700 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
20710 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
20720 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
20730 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
20740 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
20750 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
20760 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
20770 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
20780 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
20790 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
207a0 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lled. */.       
207b0 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
207c0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
207d0 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
207e0 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
207f0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
20800 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20810 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
20820 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
20830 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
20840 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
20850 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
20860 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
20870 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
20880 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
20890 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
208a0 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
208b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
208c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
208d0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
208e0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
208f0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
20900 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20910 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
20920 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
20930 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
20940 65 6c 6c 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  ellKey, 0, 0);. 
20950 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
20960 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20970 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
20980 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
20990 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
209a0 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
209b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
209c0 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
209d0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
209e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
209f0 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
20a00 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
20a10 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
20a20 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
20a30 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
20a40 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
20a50 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  lwr - 1;.       
20a60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20a80 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
20a90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
20aa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
20ab0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
20ac0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
20ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20ae0 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
20af0 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
20b00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b10 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
20b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20b30 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
20b40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20b50 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
20b60 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
20b70 65 5d 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b  e] = (u16)((lwr+
20b80 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  upr)/2);.    }. 
20b90 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
20ba0 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
20bb0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
20bc0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
20bd0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
20be0 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
20bf0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
20c00 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
20c10 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
20c20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
20c30 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
20c40 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
20c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
20c60 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
20c70 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
20c80 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
20c90 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
20ca0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20cb0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
20cc0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
20cd0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20ce0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
20cf0 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
20d00 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
20d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20d20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
20d30 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
20d40 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
20d50 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
20d60 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75  u16)lwr;.    pCu
20d70 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
20d80 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
20d90 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  idNKey = 0;.    
20da0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
20db0 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
20dc0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
20dd0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
20de0 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
20df0 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  sh:.  return rc;
20e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
20e10 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
20e20 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
20e30 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
20e40 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
20e50 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
20e60 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
20e70 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
20e80 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
20e90 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
20ea0 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
20eb0 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
20ec0 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   work..*/.int sq
20ed0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
20ee0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
20ef0 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
20f00 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
20f10 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
20f20 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
20f30 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
20f40 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
20f50 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
20f60 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
20f70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
20f80 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
20f90 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
20fa0 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
20fb0 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
20fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
20fd0 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
20fe0 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
20ff0 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
21000 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
21010 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
21020 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21040 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
21050 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
21060 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
21070 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
21080 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72  ex key */.  char
21090 20 61 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20   aSpace[150];   
210a0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
210b0 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
210c0 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
210d0 6c 6c 6f 63 20 2a 2f 0a 0a 0a 20 20 69 66 28 20  lloc */...  if( 
210e0 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
210f0 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28  rt( nKey==(i64)(
21100 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20  int)nKey );.    
21110 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  pIdxKey = sqlite
21120 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
21130 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
21140 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
21150 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 20 20 20 20 20 20 20 20 61 53 70 61 63 65 2c           aSpace,
21180 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29   sizeof(aSpace))
21190 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
211a0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
211b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
211c0 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
211d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
211e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
211f0 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
21200 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
21210 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20   bias, pRes);.  
21220 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
21230 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
21240 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
21250 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20  pIdxKey);.  }.  
21260 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
21270 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
21280 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
21290 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
212a0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
212b0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
212c0 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
212d0 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
212e0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
212f0 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
21300 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
21310 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
21320 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
21330 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
21340 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
21350 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
21360 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
21370 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
21380 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
21390 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
213a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
213b0 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
213c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
213d0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
213e0 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
213f0 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
21400 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
21410 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
21420 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
21430 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
21440 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
21450 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
21460 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
21470 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
21480 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
21490 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
214a0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
214b0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
214c0 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
214d0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
214e0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
214f0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
21500 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
21510 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
21520 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
21530 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
21540 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
21550 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
21560 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
21570 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
21580 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21590 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
215a0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
215b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
215c0 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
215d0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
215e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
215f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21600 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
21610 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
21620 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
21630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
21640 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
21650 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
21660 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
21670 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
21680 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
21690 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
216a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
216b0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
216c0 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
216d0 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
216e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
216f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21700 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
21710 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
21720 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21730 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
21740 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
21750 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
21760 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
21770 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
21780 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e  rt( idx<=pPage->
21790 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72  nCell );..  pCur
217a0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
217b0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
217c0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  Key = 0;.  if( i
217d0 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
217e0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
217f0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
21800 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
21810 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
21820 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
21830 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
21840 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
21850 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
21860 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
21870 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
21880 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
21890 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
218a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rc;.    }.    do
218b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
218c0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
218d0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
218e0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
218f0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
21900 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
21910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21930 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
21940 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
21950 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
21960 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21970 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
21980 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
21990 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
219a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
219b0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
219c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
219d0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
219e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
219f0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
21a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21a10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21a20 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
21a30 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
21a40 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
21a50 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
21a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21a70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
21a80 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
21a90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
21aa0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  }.../*.** Step t
21ab0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
21ac0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
21ad0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
21ae0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
21af0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
21b00 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
21b10 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
21b20 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
21b30 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
21b40 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
21b50 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
21b60 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
21b70 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
21b80 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
21b90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21ba0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
21bb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
21bc0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
21bd0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
21be0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
21bf0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21c00 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
21c10 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
21c20 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
21c30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21c40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
21c50 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
21c60 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  tLast = 0;.  if(
21c70 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
21c80 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
21c90 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
21ca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21cb0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
21cc0 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a  pCur->skip<0 ){.
21cd0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
21ce0 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
21cf0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
21d00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
21d10 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a  Cur->skip = 0;..
21d20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
21d30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21d40 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
21d50 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
21d60 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
21d70 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
21d80 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
21d90 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
21da0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
21db0 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
21dc0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
21dd0 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
21de0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
21df0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
21e00 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
21e10 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
21e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
21e30 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
21e40 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29  Cur->iPage]==0 )
21e50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
21e60 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
21e70 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
21e80 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
21e90 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
21ea0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
21eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21ec0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21ed0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
21ee0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
21ef0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
21f00 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
21f10 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
21f20 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43  Key = 0;..    pC
21f30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21f40 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
21f50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
21f60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
21f70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
21f80 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
21f90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
21fa0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
21fb0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
21fc0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
21fd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21fe0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
21ff0 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
22000 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22010 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
22020 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
22030 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22040 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
22050 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
22060 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
22070 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
22080 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
22090 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
220a0 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
220b0 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
220c0 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
220d0 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
220e0 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
220f0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
22100 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
22110 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
22120 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
22130 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
22140 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
22150 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
22160 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
22170 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
22180 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
22190 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
221a0 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
221b0 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
221c0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
221d0 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
221e0 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
221f0 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
22200 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
22210 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
22220 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
22230 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
22240 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
22250 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65  ot 0, then a (fe
22260 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20  eble) effort is 
22270 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
22280 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
22290 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
222a0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
222b0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
222c0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
222d0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
222e0 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
222f0 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
22300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
22310 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
22320 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
22330 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
22340 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
22350 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72  exact" parameter
22360 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74   is not 0, and t
22370 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e  he page-number n
22380 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a  earby exists .**
22390 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
223a0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
223b0 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65   it is guarentee
223c0 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
223d0 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c  . This.** is onl
223e0 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  y used by auto-v
223f0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20  acuum databases 
22400 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
22410 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a  a new table..*/.
22420 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
22430 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
22440 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
22450 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
22460 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ge, .  Pgno *pPg
22470 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72  no, .  Pgno near
22480 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29  by,.  u8 exact.)
22490 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
224a0 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
224b0 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
224c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
224d0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
224e0 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
224f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
22500 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
22510 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
22520 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
22530 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
22540 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
22550 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
22560 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
22570 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
22580 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
22590 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
225a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
225b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
225c0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
225d0 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 70 61  1;.  mxPage = pa
225e0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
225f0 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
22600 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
22610 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 6d  [36]);.  if( n>m
22620 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
22630 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
22640 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
22650 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
22660 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
22670 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
22680 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
22690 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
226a0 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
226b0 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
226c0 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
226d0 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
226e0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
226f0 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
22700 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
22710 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65  'exact' paramete
22720 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61  r was true and a
22730 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
22740 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
22750 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
22760 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
22770 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
22780 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
22790 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
227a0 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
227b0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
227c0 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
227d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
227e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
227f0 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20     if( exact && 
22800 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
22810 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  {.      u8 eType
22820 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22830 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
22840 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
22850 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
22860 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
22870 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
22880 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
22890 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
228a0 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65   rc;.      if( e
228b0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
228c0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
228d0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
228e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
228f0 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a  pPgno = nearby;.
22900 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
22910 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
22920 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
22930 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
22940 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
22950 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
22960 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
22970 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
22980 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
22990 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
229a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
229b0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
229c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
229d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
229e0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
229f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
22a00 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
22a10 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
22a20 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
22a30 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
22a40 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
22a50 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
22a60 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
22a70 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
22a80 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
22a90 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
22aa0 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
22ab0 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
22ac0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
22ad0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
22ae0 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
22af0 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
22b00 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
22b10 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
22b20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
22b30 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
22b40 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
22b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
22b60 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
22b70 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
22b80 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
22b90 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
22ba0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
22bb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
22bc0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
22bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22be0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
22bf0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
22c00 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
22c10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22c20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
22c30 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
22c40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
22c50 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
22c60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
22c70 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
22c80 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
22c90 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
22ca0 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
22cb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
22cc0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
22cd0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
22ce0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
22cf0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
22d00 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
22d10 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
22d20 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
22d30 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
22d40 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
22d50 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
22d60 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
22d70 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
22d80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22d90 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
22da0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
22db0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
22dc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
22dd0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
22de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22df0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
22e00 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
22e10 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
22e20 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
22e30 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
22e40 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
22e50 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
22e60 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
22e70 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
22e80 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
22e90 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
22ea0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
22eb0 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
22ec0 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
22ed0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
22ee0 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
22ef0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
22f00 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
22f10 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
22f20 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
22f30 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
22f40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
22f50 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
22f60 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
22f70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
22f80 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
22f90 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
22fa0 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54  st && nearby==iT
22fb0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
22fc0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
22fd0 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
22fe0 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
22ff0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
23000 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
23010 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
23020 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
23030 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
23040 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
23050 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54  sert( *pPgno==iT
23060 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  runk );.        
23070 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
23080 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
23090 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
230a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
230b0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
230c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
230d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
230e0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
230f0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
23100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23110 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
23120 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
23130 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
23140 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
23150 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
23160 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
23170 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
23180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23190 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
231a0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
231b0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
231c0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
231d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
231e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
231f0 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
23200 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
23210 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
23220 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
23230 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
23240 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
23250 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
23260 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
23270 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
23280 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
23290 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
232a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
232b0 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
232c0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
232d0 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
232e0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
232f0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
23300 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
23310 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
23320 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23330 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
23350 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
23360 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
23370 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
23380 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
23390 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
233a0 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
233b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
233c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
233d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
233e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
233f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
23400 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
23410 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
23420 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
23430 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
23440 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23460 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
23470 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
23480 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
23490 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
234a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
234b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
234c0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
234d0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
234e0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
234f0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
23500 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
23510 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
23520 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
23530 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
23540 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
23550 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
23560 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
23570 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
23580 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
23590 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
235a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
235b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
235c0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
235d0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
235e0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
235f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
23600 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
23610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
23620 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
23630 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23640 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
23650 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
23660 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
23670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23680 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
23690 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
236a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
236b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
236c0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
236d0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
236e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
236f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
23700 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
23710 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
23720 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
23730 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
23740 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
23750 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
23760 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
23770 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
23780 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
23790 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
237a0 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
237b0 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
237c0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
237d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
237e0 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
237f0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ata;.        rc 
23800 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
23810 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
23820 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
23830 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
23840 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
23850 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
23860 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
23870 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
23880 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20        u32 i;.   
23890 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b         int dist;
238a0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
238b0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
238c0 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74    dist = get4byt
238d0 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
238e0 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
238f0 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69   if( dist<0 ) di
23900 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20  st = -dist;.    
23910 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
23920 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
23930 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67        int d2 = g
23940 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
23950 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b  +i*4]) - nearby;
23960 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23970 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32   d2<0 ) d2 = -d2
23980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23990 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
239a0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
239b0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
239c0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
239d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
239e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
239f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23a00 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
23a10 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
23a20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
23a30 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
23a40 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
23a50 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
23a60 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
23a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
23a80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
23a90 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
23aa0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
23ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23ac0 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
23ad0 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
23ae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
23af0 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
23b00 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
23b10 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
23b20 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
23b30 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61        nPage = pa
23b40 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
23b50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23b60 20 69 50 61 67 65 3e 6e 50 61 67 65 20 29 7b 0a   iPage>nPage ){.
23b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23b80 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65  ree page off the
23b90 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
23ba0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
23bb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
23bc0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
23bd0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
23be0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
23bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23c00 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
23c10 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
23c20 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
23c30 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
23c40 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
23c50 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
23c60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23c70 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
23c80 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
23c90 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
23ca0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
23cb0 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
23cc0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
23cd0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
23ce0 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
23cf0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
23d00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
23d10 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
23d20 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
23d30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23d40 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
23d50 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
23d60 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) );.          n
23d70 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
23d80 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
23d90 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20  Bt, *pPgno);.   
23da0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23db0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
23dc0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
23dd0 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
23de0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
23df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23e00 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23e20 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
23e30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
23e40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23e60 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
23e70 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
23e80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23ea0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
23eb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23ec0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
23ed0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
23ee0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
23ef0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
23f00 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
23f10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
23f20 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
23f30 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
23f40 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20  list, so create 
23f50 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68  a new page at th
23f60 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20  e.    ** end of 
23f70 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
23f80 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65  int nPage = page
23f90 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
23fa0 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50  .    *pPgno = nP
23fb0 61 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66  age + 1;..    if
23fc0 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
23fd0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
23fe0 20 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e   ){.      (*pPgn
23ff0 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  o)++;.    }..#if
24000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24010 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
24020 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
24030 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
24040 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f  PAGE(pBt, *pPgno
24050 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
24060 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
24070 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
24080 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
24090 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
240a0 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
240b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
240c0 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
240d0 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
240e0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
240f0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
24100 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
24110 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
24120 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
24130 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
24140 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
24150 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
24160 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
24170 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
24180 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
24190 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
241a0 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
241b0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
241c0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
241d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
241e0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
241f0 74 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c  t, *pPgno, &pPg,
24200 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
24210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24220 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24230 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24240 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
24250 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
24260 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
24270 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
24280 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
24290 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
242a0 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
242b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
242c0 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29  pBt) ){ (*pPgno)
242d0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
242e0 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
242f0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
24300 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
24310 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
24320 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
24330 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
24340 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
24350 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
24360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24370 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
24380 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
24390 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
243a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
243b0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
243c0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
243d0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
243e0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
243f0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
24400 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
24410 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
24420 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
24430 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
24440 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
24450 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
24460 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
24470 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
24480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24490 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
244a0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
244b0 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
244c0 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
244d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
244e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
244f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
24500 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
24510 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
24520 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
24530 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
24540 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
24550 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
24560 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
24570 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
24580 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
24590 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
245a0 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
245b0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
245c0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
245d0 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
245e0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
245f0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
24600 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
24610 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
24620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24630 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
24640 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
24650 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
24660 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
24670 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
24680 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
24690 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
246a0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
246b0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
246c0 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
246d0 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
246e0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
246f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
24700 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
24710 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
24720 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
24730 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
24740 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
24750 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
24760 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
24770 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
24780 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
24790 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
247a0 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
247b0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
247c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
247d0 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
247e0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
247f0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
24800 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
24810 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
24820 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
24830 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
24840 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24850 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
24860 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
24870 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
24880 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
24890 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248b0 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
248c0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
248d0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
24900 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
24910 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
24940 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
24950 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
24960 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24970 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
24980 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
24990 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  ( iPage>1 );.  a
249a0 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
249b0 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
249c0 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
249d0 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
249e0 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
249f0 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
24a00 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
24a10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
24a20 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
24a30 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
24a40 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
24a50 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
24a60 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
24a70 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
24a80 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
24a90 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
24aa0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
24ab0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
24ac0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
24ad0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
24ae0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
24af0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
24b00 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
24b10 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66  , nFree+1);..#if
24b20 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
24b30 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
24b40 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
24b50 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
24b60 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
24b70 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
24b80 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
24b90 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
24ba0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
24bb0 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
24bc0 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
24bd0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
24be0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
24bf0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
24c00 29 29 29 0a 20 20 20 7c 7c 20 20 20 20 20 20 20  ))).   ||       
24c10 20 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74       (rc = sqlit
24c20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
24c30 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20  ge->pDbPage)).  
24c40 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
24c50 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
24c60 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
24c70 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
24c80 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
24c90 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
24ca0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
24cb0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
24cc0 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
24cd0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
24ce0 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
24cf0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
24d00 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
24d10 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
24d20 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
24d30 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
24d40 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
24d50 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  EPAGE, 0);.    i
24d60 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
24d70 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
24d80 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
24d90 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
24da0 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
24db0 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
24dc0 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
24dd0 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
24de0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
24df0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
24e00 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
24e10 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
24e20 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
24e30 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
24e40 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
24e50 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
24e60 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
24e70 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
24e80 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
24e90 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
24ea0 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
24eb0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
24ec0 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
24ed0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
24ee0 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
24ef0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
24f00 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
24f10 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
24f20 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
24f30 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ree!=0 ){.    in
24f40 74 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  t nLeaf;        
24f50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
24f60 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
24f70 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
24f80 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
24f90 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
24fa0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
24fb0 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  2]);.    rc = sq
24fc0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
24fd0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
24fe0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
24ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25000 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
25010 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
25020 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
25030 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
25040 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
25050 20 20 69 66 28 20 6e 4c 65 61 66 3c 30 20 29 7b    if( nLeaf<0 ){
25060 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
25070 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25080 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
25090 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
250a0 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42      if( nLeaf<pB
250b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
250c0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
250d0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
250e0 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
250f0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
25100 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
25110 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
25120 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
25130 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
25140 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
25150 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
25160 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
25170 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
25180 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
25190 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
251a0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
251b0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
251c0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
251d0 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
251e0 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
251f0 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
25200 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
25210 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
25220 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
25230 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
25240 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
25250 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
25260 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
25270 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
25280 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
25290 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
252a0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
252b0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
252c0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
252d0 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
252e0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
252f0 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
25300 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20  will contain to 
25310 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
25320 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
25330 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
25340 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
25350 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
25360 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
25370 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
25380 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
25390 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
253a0 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
253b0 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
253c0 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
253d0 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
253e0 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
253f0 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
25400 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
25410 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
25420 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
25430 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
25440 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
25450 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
25460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25470 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
25480 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
25490 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
254a0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
254b0 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
254c0 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69  f*4], iPage);.#i
254d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  fndef SQLITE_SEC
254e0 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  URE_DELETE.     
254f0 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
25500 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25510 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
25520 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
25530 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
25540 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  f.        rc = b
25550 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
25560 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
25570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
25580 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
25590 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
255a0 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
255b0 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
255c0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
255d0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
255e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
255f0 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
25600 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
25610 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
25620 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
25630 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
25640 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
25650 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
25660 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
25670 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
25680 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
25690 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
256a0 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
256b0 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
256c0 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
256d0 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
256e0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
256f0 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
25700 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
25710 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
25720 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
25730 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
25740 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
25750 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 20 20 28  ..  */.  if(   (
25760 28 21 70 50 61 67 65 29 20 26 26 20 28 30 20 21  (!pPage) && (0 !
25770 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  = (rc = sqlite3B
25780 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
25790 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
257a0 30 29 29 29 29 0a 20 20 20 20 20 7c 7c 20 28 30  0)))).     || (0
257b0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
257c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
257d0 65 2d 3e 70 44 62 50 61 67 65 29 29 29 0a 20 20  e->pDbPage))).  
257e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
257f0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
25800 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
25810 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
25820 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
25830 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
25840 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
25850 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
25860 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
25870 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
25880 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
25890 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
258a0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
258b0 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
258c0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
258d0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
258e0 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
258f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
25900 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
25910 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
25920 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
25930 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28  ic int freePage(
25940 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
25950 0a 20 20 72 65 74 75 72 6e 20 66 72 65 65 50 61  .  return freePa
25960 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
25970 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
25980 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  no);.}../*.** Fr
25990 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
259a0 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
259b0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
259c0 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
259d0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
259e0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
259f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
25a00 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
25a10 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
25a20 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
25a30 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
25a40 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
25a50 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31   int nOvfl;.  u1
25a60 36 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  6 ovflPageSize;.
25a70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25a80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
25a90 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
25aa0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
25ab0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
25ac0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
25ad0 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
25ae0 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
25af0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25b00 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
25b10 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
25b20 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
25b30 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
25b40 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
25b50 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
25b60 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
25b70 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
25b80 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
25b90 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
25ba0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
25bb0 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
25bc0 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
25bd0 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
25be0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
25bf0 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
25c00 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50  .  assert( ovflP
25c10 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e  gno==0 || nOvfl>
25c20 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  0 );.  while( nO
25c30 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
25c40 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
25c50 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
25c60 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
25c70 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
25c80 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
25c90 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
25ca0 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
25cb0 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
25cc0 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
25cd0 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
25ce0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
25cf0 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
25d00 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
25d10 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
25d20 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
25d30 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
25d40 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
25d50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25d60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25d70 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
25d80 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
25d90 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
25da0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
25db0 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
25dc0 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
25dd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
25de0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72     }.    rc = fr
25df0 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
25e00 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
25e10 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
25e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
25e30 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
25e40 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
25e50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
25e60 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
25e70 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
25e80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25e90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
25ea0 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
25eb0 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
25ec0 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
25ed0 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
25ee0 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
25ef0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
25f00 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
25f10 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
25f20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
25f30 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
25f40 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
25f50 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
25f60 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
25f70 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
25f80 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
25f90 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
25fa0 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
25fb0 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
25fc0 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
25fd0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
25fe0 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
25ff0 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
26000 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
26010 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
26020 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
26030 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
26040 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
26050 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
26060 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
26070 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
26080 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
26090 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
260a0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
260b0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
260c0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
260d0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
260e0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
260f0 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
26100 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
26110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
26120 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
26130 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
26140 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
26150 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
26160 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
26170 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
26180 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
26190 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
261a0 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
261b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
261c0 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
261d0 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
261e0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
261f0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
26200 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
26210 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
26220 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
26230 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
26240 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
26250 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
26260 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
26270 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
26280 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
26290 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
262a0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
262b0 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
262c0 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
262d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
262e0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
262f0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
26300 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
26310 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
26320 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
26330 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
26340 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
26350 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
26360 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
26370 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
26380 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
26390 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
263a0 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
263b0 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
263c0 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
263d0 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
263e0 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
263f0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
26400 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
26410 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
26420 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
26430 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
26440 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
26450 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
26460 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
26470 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
26480 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
26490 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
264a0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
264b0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
264c0 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
264d0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
264e0 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
264f0 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72  der], nData+nZer
26500 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
26510 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d   nData = nZero =
26520 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   0;.  }.  nHeade
26530 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
26540 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
26550 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
26560 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
26570 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
26580 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
26590 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
265a0 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
265b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
265c0 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
265d0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
265e0 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74  Data==(u32)(nDat
265f0 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20  a+nZero) );.  . 
26600 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
26610 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
26620 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
26630 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
26640 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
26650 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
26660 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
26670 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
26680 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
26690 66 28 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66  f( nKey>0x7fffff
266a0 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b  ff || pKey==0 ){
266b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
266c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
266d0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
266e0 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20   += (int)nKey;. 
266f0 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
26700 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
26710 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
26720 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
26730 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
26740 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
26750 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
26760 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
26770 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
26780 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
26790 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
267a0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
267b0 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
267c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
267d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
267e0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
267f0 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
26800 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
26810 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
26820 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
26830 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
26840 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
26850 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
26860 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
26870 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
26880 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
26890 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
268a0 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
268b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
268c0 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
268d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
268e0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
268f0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
26900 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
26910 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
26920 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
26930 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
26940 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
26950 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
26960 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
26970 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
26980 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
26990 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
269a0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
269b0 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
269c0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
269d0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
269e0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
269f0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
26a00 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
26a10 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
26a20 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
26a30 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
26a40 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
26a50 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
26a60 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
26a70 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
26a80 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
26a90 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
26aa0 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
26ab0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
26ac0 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
26ad0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
26ae0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
26af0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
26b00 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
26b10 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
26b20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
26b30 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
26b40 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
26b50 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
26b60 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
26b70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26b80 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
26b90 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
26ba0 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
26bb0 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
26bc0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
26bd0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
26be0 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
26bf0 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  trmap);.        
26c00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26c10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
26c20 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
26c30 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
26c40 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
26c50 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
26c60 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
26c70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26c80 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
26c90 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
26ca0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
26cb0 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
26cc0 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
26cd0 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
26ce0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
26cf0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
26d00 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
26d10 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
26d20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
26d30 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
26d40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
26d50 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
26d60 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
26d70 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
26d80 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
26d90 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
26da0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
26db0 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
26dc0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
26dd0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
26de0 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
26df0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
26e00 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
26e10 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
26e20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
26e30 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
26e40 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
26e50 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
26e60 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
26e70 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
26e80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
26e90 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
26ea0 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
26eb0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
26ec0 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
26ed0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
26ee0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
26ef0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
26f00 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
26f10 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
26f20 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
26f30 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
26f40 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
26f50 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
26f60 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
26f70 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
26f80 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
26f90 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
26fa0 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
26fb0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
26fc0 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
26fd0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
26fe0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
26ff0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
27000 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
27010 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
27020 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
27030 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
27040 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
27050 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
27060 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
27070 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
27080 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
27090 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
270a0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
270b0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
270c0 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
270d0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
270e0 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
270f0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
27100 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
27110 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
27120 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
27130 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
27140 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
27150 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
27160 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
27170 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
27180 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
27190 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
271a0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
271b0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
271c0 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
271d0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
271e0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
271f0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
27200 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
27210 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
27220 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
27230 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
27240 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
27250 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
27260 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
27270 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
27280 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
27290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
272a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
272b0 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
272c0 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
272d0 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
272e0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
272f0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
27300 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
27310 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
27320 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
27330 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
27340 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
27350 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
27360 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
27370 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
27380 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
27390 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
273a0 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
273b0 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
273c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
273d0 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
273e0 73 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43  static int dropC
273f0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
27400 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
27410 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20   sz){.  int i;  
27420 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
27430 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
27440 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
27450 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
27460 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
27470 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
27480 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
27490 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
274a0 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
274b0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
274c0 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
274d0 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
274e0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
274f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
27500 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
27510 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
27520 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
27530 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
27540 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
27550 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
27560 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
27570 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
27580 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
27590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
275a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
275b0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
275c0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
275d0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
275e0 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
275f0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
27600 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
27610 62 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28  byte(ptr);.  if(
27620 20 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f   (pc<pPage->hdrO
27630 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
27640 6c 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20  leaf?0:4)).     
27650 7c 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d  || (pc+sz>pPage-
27660 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
27670 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
27680 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
27690 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
276a0 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
276b0 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
276c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
276d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
276e0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b    }.  for(i=idx+
276f0 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
27700 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
27710 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
27720 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
27730 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
27740 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
27750 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
27760 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
27770 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
27780 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
27790 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74  Free += 2;.  ret
277a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
277b0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
277c0 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
277d0 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
277e0 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
277f0 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
27800 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
27810 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
27820 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
27830 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
27840 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
27850 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
27860 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
27870 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
27880 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
27890 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
278a0 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
278b0 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
278c0 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
278d0 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
278e0 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
278f0 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
27900 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
27910 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
27920 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
27930 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
27940 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
27950 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
27960 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
27970 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
27980 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
27990 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
279a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
279b0 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
279c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
279d0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
279e0 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
279f0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
27a00 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
27a10 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
27a20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
27a30 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
27a40 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
27a50 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
27a60 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
27a70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
27a80 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
27a90 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
27aa0 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
27ab0 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
27ac0 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
27ad0 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c  c int insertCell
27ae0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
27af0 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
27b00 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
27b10 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
27b20 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
27b30 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
27b40 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
27b50 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
27b60 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
27b70 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
27b80 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
27b90 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
27ba0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
27bb0 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
27bc0 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
27bd0 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
27be0 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
27bf0 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
27c00 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  eded */.  Pgno i
27c10 43 68 69 6c 64 20 20 20 20 20 20 20 2f 2a 20 49  Child       /* I
27c20 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c  f non-zero, repl
27c30 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65  ace first 4 byte
27c40 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75  s with this valu
27c50 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
27c60 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  x;          /* W
27c70 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
27c80 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
27c90 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
27ca0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
27cb0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
27cc0 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
27cd0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
27ce0 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  byte of content 
27cf0 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20  for any cell in 
27d00 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
27d10 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
27d20 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
27d30 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
27d40 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
27d50 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
27d60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
27d70 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
27d80 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
27d90 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
27da0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
27db0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
27dc0 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68  nto data[] of th
27dd0 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
27de0 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
27df0 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
27e00 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
27e10 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
27e20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
27e30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
27e40 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
27e50 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
27e60 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f  *ptr;          /
27e70 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e  * Used for movin
27e80 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72  g information ar
27e90 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a  ound in data[] *
27ea0 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d  /..  int nSkip =
27eb0 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30   (iChild ? 4 : 0
27ec0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  );..  assert( i>
27ed0 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
27ee0 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
27ef0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
27f00 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
27f10 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
27f20 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
27f30 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34  (pPage->pBt)<=54
27f40 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  60 );.  assert( 
27f50 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
27f60 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  <=ArraySize(pPag
27f70 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61  e->aOvfl) );.  a
27f80 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
27f90 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
27fa0 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
27fb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
27fc0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
27fd0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
27fe0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
27ff0 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
28000 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
28010 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
28020 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53   memcpy(pTemp+nS
28030 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  kip, pCell+nSkip
28040 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
28050 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
28060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28070 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
28080 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
28090 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
280a0 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
280b0 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
280c0 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73  ssert( j<(int)(s
280d0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
280e0 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
280f0 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a  ->aOvfl[0])) );.
28100 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
28110 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  [j].pCell = pCel
28120 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  l;.    pPage->aO
28130 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31  vfl[j].idx = (u1
28140 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  6)i;.  }else{.  
28150 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
28160 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
28170 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
28180 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28190 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
281a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
281b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
281c0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
281d0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
281e0 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
281f0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
28200 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
28210 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f  drOffset;.    to
28220 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
28230 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
28240 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
28250 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
28260 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
28270 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
28280 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69  nCell + 2;.    i
28290 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
282a0 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65  + 2*i;.    if( e
282b0 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b  nd > top - sz ){
282c0 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65 66 72  .      rc = defr
282d0 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
282e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
282f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28300 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
28320 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
28330 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
28340 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b     assert( end +
28350 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20   sz <= top );.  
28360 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c    }.    idx = al
28370 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
28380 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65  e, sz);.    asse
28390 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20  rt( idx>0 );.   
283a0 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20   assert( end <= 
283b0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
283c0 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 69 66  dr+5]) );.    if
283d0 20 28 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65   (idx+sz > pPage
283e0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
283f0 65 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e) {.      retur
28400 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
28410 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
28420 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
28430 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
28440 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63  e -= 2;.    memc
28450 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
28460 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
28470 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
28480 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
28490 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64       put4byte(&d
284a0 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64  ata[idx], iChild
284b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
284c0 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64  (j=end-2, ptr=&d
284d0 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
284e0 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
284f0 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
28500 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
28510 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
28520 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
28530 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
28540 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
28550 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
28560 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66  age->nCell);.#if
28570 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28580 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
28590 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
285a0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
285b0 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
285c0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
285d0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
285e0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
285f0 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
28600 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
28610 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
28620 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
28630 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
28640 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
28650 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
28660 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d  e, pCell);.    }
28670 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72  .#endif.  }..  r
28680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
286a0 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f  list of cells to
286b0 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61   a page.  The pa
286c0 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  ge should be ini
286d0 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  tially empty..**
286e0 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67   The cells are g
286f0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74  uaranteed to fit
28700 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
28710 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
28720 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d  emblePage(.  Mem
28730 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
28740 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
28750 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20   assemblied */. 
28760 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
28770 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
28780 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
28790 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f   to this page */
287a0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
287b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73       /* Pointers
287c0 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20   to cell bodies 
287d0 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20  */.  u16 *aSize 
287e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
287f0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a  of the cells */.
28800 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
28810 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
28820 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
28830 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a  pCellptr;     /*
28840 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
28850 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
28860 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
28870 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
28880 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
28890 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  y */.  u8 * cons
288a0 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
288b0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
288c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
288d0 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20   data for pPage 
288e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  */.  const int h
288f0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
28900 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
28910 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
28920 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ader on pPage */
28930 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73  .  const int nUs
28940 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  able = pPage->pB
28950 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  t->usableSize; /
28960 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
28970 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
28980 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
28990 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
289a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
289b0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
289c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
289d0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30  assert( nCell>=0
289e0 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45   && nCell<=MX_CE
289f0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
28a00 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
28a10 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20  >pBt)<=5460 );. 
28a20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
28a30 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28a40 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
28a50 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
28a60 74 68 61 74 20 74 68 65 20 70 61 67 65 20 68 61  that the page ha
28a70 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f  s just been zero
28a80 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29  ed by zeroPage()
28a90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
28aa0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
28ab0 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62  .  assert( get2b
28ac0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
28ad0 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20  )==nUsable );.. 
28ae0 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74   pCellptr = &dat
28af0 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
28b00 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a  set + nCell*2];.
28b10 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73    cellbody = nUs
28b20 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  able;.  for(i=nC
28b30 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ell-1; i>=0; i--
28b40 29 7b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  ){.    pCellptr 
28b50 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f  -= 2;.    cellbo
28b60 64 79 20 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  dy -= aSize[i];.
28b70 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
28b80 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29  llptr, cellbody)
28b90 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
28ba0 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
28bb0 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69  Cell[i], aSize[i
28bc0 5d 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79  ]);.  }.  put2by
28bd0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
28be0 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62   nCell);.  put2b
28bf0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
28c00 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  , cellbody);.  p
28c10 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
28c20 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c  nCell*2 + nUsabl
28c30 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  e - cellbody);. 
28c40 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
28c50 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  (u16)nCell;.}../
28c60 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
28c70 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
28c80 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
28c90 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
28ca0 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
28cb0 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
28cc0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
28cd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
28ce0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
28cf0 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
28d00 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
28d10 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
28d20 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
28d30 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
28d40 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
28d50 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
28d60 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
28d70 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
28d80 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
28d90 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
28da0 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
28db0 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
28dc0 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
28dd0 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
28de0 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
28df0 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
28e00 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
28e10 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
28e20 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
28e30 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
28e40 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
28e50 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
28e60 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
28e70 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
28e80 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
28e90 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
28ea0 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
28eb0 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
28ec0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ee0 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
28ef0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
28f00 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
28f10 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
28f20 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
28f30 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
28f40 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
28f50 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
28f60 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
28f70 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
28f80 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
28f90 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
28fa0 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
28fb0 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
28fc0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
28fd0 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
28fe0 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
28ff0 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
29000 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
29010 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
29020 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
29030 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
29040 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
29050 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
29060 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61  ead of trying ba
29070 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
29080 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
29090 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
290a0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
290b0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
290c0 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
290d0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
290e0 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
290f0 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
29100 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
29110 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
29120 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
29130 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
29140 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
29150 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
29160 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
29170 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
29180 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
29190 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
291a0 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
291b0 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
291c0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
291d0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
291e0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
291f0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
29200 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
29210 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
29220 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
29230 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
29240 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
29250 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
29260 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
29270 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
29280 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
29290 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
292a0 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
292b0 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
292c0 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
292d0 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
292e0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
292f0 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
29300 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
29310 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
29320 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
29330 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
29340 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
29350 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
29360 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
29370 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
29380 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
29390 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
293a0 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
293b0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
293c0 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
293d0 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
293e0 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
293f0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
29400 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
29410 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
29420 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
29430 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
29440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29450 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
29460 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
29470 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
29480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
294a0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
294b0 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
294c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294d0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
294e0 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
294f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29500 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
29510 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
29520 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29530 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
29540 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
29550 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
29560 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
29570 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ow==1 );..  if( 
29580 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20  pPage->nCell<=0 
29590 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
295a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
295b0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
295c0 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61  ew page. This pa
295d0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ge will become t
295e0 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  he right-sibling
295f0 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e   of .  ** pPage.
29600 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74   Make the parent
29610 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20   page writable, 
29620 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
29630 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a  divider cell.  *
29640 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65  * may be inserte
29650 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65  d. If both these
29660 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
29670 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63  successful, proc
29680 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eed..  */.  rc =
29690 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
296a0 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
296b0 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
296c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
296d0 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20  E_OK ){..    u8 
296e0 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b  *pOut = &pSpace[
296f0 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  4];.    u8 *pCel
29700 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  l = pPage->aOvfl
29710 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75  [0].pCell;.    u
29720 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  16 szCell = cell
29730 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
29740 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70  Cell);.    u8 *p
29750 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72  Stop;..    asser
29760 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
29770 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d  swriteable(pNew-
29780 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
29790 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
297a0 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49  aData[0]==(PTF_I
297b0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
297c0 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a  TA|PTF_LEAF) );.
297d0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
297e0 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  w, PTF_INTKEY|PT
297f0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
29800 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  EAF);.    assemb
29810 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
29820 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
29830 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
29840 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
29850 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
29860 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
29870 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
29880 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
29890 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
298a0 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
298b0 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
298c0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
298d0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
298e0 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
298f0 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
29900 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
29910 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
29920 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
29930 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
29940 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
29950 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
29960 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
29970 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
29980 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
29990 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
299a0 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
299b0 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
299c0 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
299d0 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
299e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
299f0 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
29a00 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
29a10 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
29a20 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
29a30 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
29a40 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
29a50 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
29a60 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
29a70 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
29a80 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
29a90 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t->pgno);.      
29aa0 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
29ab0 3e 6d 69 6e 4c 6f 63 61 6c 20 26 26 20 72 63 3d  >minLocal && rc=
29ac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29ad0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
29ae0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
29af0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
29b00 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
29b10 2a 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64  * Create a divid
29b20 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72  er cell to inser
29b30 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  t into pParent. 
29b40 54 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  The divider cell
29b50 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73  .    ** consists
29b60 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67   of a 4-byte pag
29b70 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61  e number (the pa
29b80 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61  ge number of pPa
29b90 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  ge) and.    ** a
29ba0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
29bb0 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63   key value (whic
29bc0 68 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  h must be the sa
29bd0 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a  me value as the.
29be0 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b      ** largest k
29bf0 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20  ey on pPage)..  
29c00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66    **.    ** To f
29c10 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20  ind the largest 
29c20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61  key value on pPa
29c30 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74  ge, first find t
29c40 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20  he right-most . 
29c50 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
29c60 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74  age. The first t
29c70 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69  wo fields of thi
29c80 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a  s cell are the .
29c90 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65      ** record-le
29ca0 6e 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65  ngth (a variable
29cb0 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20   length integer 
29cc0 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20  at most 32-bits 
29cd0 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20  in size).    ** 
29ce0 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75  and the key valu
29cf0 65 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e (a variable le
29d00 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61  ngth integer, ma
29d10 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65  y have any value
29d20 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  )..    ** The fi
29d30 72 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65  rst of the while
29d40 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f  (...) loops belo
29d50 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65  w skips over the
29d60 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20   record-length. 
29d70 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65     ** field. The
29d80 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e   second while(..
29d90 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74  .) loop copies t
29da0 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f  he key value fro
29db0 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c  m the.    ** cel
29dc0 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20  l on pPage into 
29dd0 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
29de0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  r..    */.    pC
29df0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
29e00 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
29e10 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70  ll-1);.    pStop
29e20 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
29e30 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c    while( (*(pCel
29e40 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43  l++)&0x80) && pC
29e50 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20  ell<pStop );.   
29e60 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
29e70 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
29e80 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70  (*(pOut++) = *(p
29e90 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26  Cell++))&0x80) &
29ea0 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
29eb0 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  ..    /* Insert 
29ec0 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
29ed0 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e  cell into pParen
29ee0 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74  t. */.    insert
29ef0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 50 61  Cell(pParent,pPa
29f00 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 70 53 70 61  rent->nCell,pSpa
29f10 63 65 2c 28 69 6e 74 29 28 70 4f 75 74 2d 70 53  ce,(int)(pOut-pS
29f20 70 61 63 65 29 2c 30 2c 70 50 61 67 65 2d 3e 70  pace),0,pPage->p
29f30 67 6e 6f 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  gno);..    /* Se
29f40 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
29f50 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61  d pointer of pPa
29f60 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rent to point to
29f70 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
29f80 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
29f90 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
29fa0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
29fb0 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
29fc0 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
29fd0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
29fe0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
29ff0 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50   */.    releaseP
2a000 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  age(pNew);.  }..
2a010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
2a020 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2a030 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2a040 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  E */..#if 0./*.*
2a050 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a060 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62  does not contrib
2a070 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ute anything to 
2a080 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  the operation of
2a090 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69   SQLite..** it i
2a0a0 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69  s sometimes acti
2a0b0 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c  vated temporaril
2a0c0 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e  y while debuggin
2a0d0 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62  g code responsib
2a0e0 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69  le .** for setti
2a0f0 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ng pointer-map e
2a100 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
2a110 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63  c int ptrmapChec
2a120 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  kPages(MemPage *
2a130 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61  *apPage, int nPa
2a140 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ge){.  int i, j;
2a150 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50  .  for(i=0; i<nP
2a160 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  age; i++){.    P
2a170 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b  gno n;.    u8 e;
2a180 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2a190 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b  age = apPage[i];
2a1a0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
2a1b0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2a1c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a1d0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
2a1e0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
2a1f0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29  age->nCell; j++)
2a200 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  {.      CellInfo
2a210 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20   info;.      u8 
2a220 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20  *z;.     .      
2a230 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  z = findCell(pPa
2a240 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 71  ge, j);.      sq
2a250 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
2a260 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c  ellPtr(pPage, z,
2a270 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69   &info);.      i
2a280 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
2a290 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  w ){.        Pgn
2a2a0 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
2a2b0 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  e(&z[info.iOverf
2a2c0 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  low]);.        p
2a2d0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76  trmapGet(pBt, ov
2a2e0 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  fl, &e, &n);.   
2a2f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2a300 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2a310 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
2a320 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  W1 );.      }.  
2a330 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2a340 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2a350 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
2a360 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20  4byte(z);.      
2a370 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2a380 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2a390 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a3a0 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2a3b0 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
2a3c0 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EE );.      }.  
2a3d0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61    }.    if( !pPa
2a3e0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2a3f0 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
2a400 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2a410 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2a420 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2a430 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2a440 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2a450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2a460 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2a470 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
2a480 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
2a490 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2a4a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
2a4b0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2a4c0 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74  to copy the cont
2a4d0 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72  ents of the b-tr
2a4e0 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a  ee node stored .
2a4f0 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d  ** on page pFrom
2a500 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66   to page pTo. If
2a510 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20   page pFrom was 
2a520 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c  not a leaf page,
2a530 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69   then.** the poi
2a540 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2a550 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20   for each child 
2a560 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64  page are updated
2a570 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
2a580 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72  parent page stor
2a590 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ed in the pointe
2a5a0 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54  r map is page pT
2a5b0 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74  o. If pFrom cont
2a5c0 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c  ained.** any cel
2a5d0 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77  ls with overflow
2a5e0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20   page pointers, 
2a5f0 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70  then the corresp
2a600 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a  onding pointer.*
2a610 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72  * map entries ar
2a620 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73  e also updated s
2a630 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e  o that the paren
2a640 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70  t page is page p
2a650 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  To..**.** If pFr
2a660 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  om is currently 
2a670 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65  carrying any ove
2a680 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74  rflow cells (ent
2a690 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d  ries in the.** M
2a6a0 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61  emPage.aOvfl[] a
2a6b0 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20  rray), they are 
2a6c0 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54  not copied to pT
2a6d0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  o. .**.** Before
2a6e0 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65   returning, page
2a6f0 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61   pTo is reinitia
2a700 6c 69 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69  lized using sqli
2a710 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
2a720 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65  ()..**.** The pe
2a730 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69  rformance of thi
2a740 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
2a750 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69  t critical. It i
2a760 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a  s only used by .
2a770 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73  ** the balance_s
2a780 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62  hallower() and b
2a790 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
2a7a0 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74  procedures, neit
2a7b0 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20  her of.** which 
2a7c0 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e  are called often
2a7d0 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69   under normal ci
2a7e0 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a  rcumstances..*/.
2a7f0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 4e  static int copyN
2a800 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61  odeContent(MemPa
2a810 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61  ge *pFrom, MemPa
2a820 67 65 20 2a 70 54 6f 29 7b 0a 20 20 42 74 53 68  ge *pTo){.  BtSh
2a830 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74  ared * const pBt
2a840 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20   = pFrom->pBt;. 
2a850 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f   u8 * const aFro
2a860 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61  m = pFrom->aData
2a870 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  ;.  u8 * const a
2a880 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b  To = pTo->aData;
2a890 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72  .  int const iFr
2a8a0 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68  omHdr = pFrom->h
2a8b0 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20  drOffset;.  int 
2a8c0 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28  const iToHdr = (
2a8d0 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f  (pTo->pgno==1) ?
2a8e0 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 69 6e 74   100 : 0);.  int
2a8f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a900 0a 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20  .  int iData;.. 
2a910 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2a920 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
2a930 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65  rt( pFrom->nFree
2a940 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 61 73  >=iToHdr );.  as
2a950 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26  sert( get2byte(&
2a960 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
2a970 5d 29 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ])<=pBt->usableS
2a980 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70  ize );..  /* Cop
2a990 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  y the b-tree nod
2a9a0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70  e content from p
2a9b0 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
2a9c0 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 69 44 61 74  e pTo. */.  iDat
2a9d0 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 46  a = get2byte(&aF
2a9e0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
2a9f0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b  ;.  memcpy(&aTo[
2aa00 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69  iData], &aFrom[i
2aa10 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62  Data], pBt->usab
2aa20 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20  leSize-iData);. 
2aa30 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f   memcpy(&aTo[iTo
2aa40 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72  Hdr], &aFrom[iFr
2aa50 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63  omHdr], pFrom->c
2aa60 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46  ellOffset + 2*pF
2aa70 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a 20 20  rom->nCell);..  
2aa80 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  /* Reinitialize 
2aa90 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74  page pTo so that
2aaa0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2aab0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
2aac0 75 63 74 75 72 65 0a 20 20 2a 2a 20 6d 61 74 63  ucture.  ** matc
2aad0 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
2aae0 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
2aaf0 6f 6e 20 6f 66 20 70 54 6f 20 22 63 61 6e 6e 6f  on of pTo "canno
2ab00 74 22 20 66 61 69 6c 2c 20 61 73 20 74 68 65 0a  t" fail, as the.
2ab10 20 20 2a 2a 20 64 61 74 61 20 63 6f 70 69 65 64    ** data copied
2ab20 20 66 72 6f 6d 20 70 46 72 6f 6d 20 69 73 20 6b   from pFrom is k
2ab30 6e 6f 77 6e 20 74 6f 20 62 65 20 76 61 6c 69 64  nown to be valid
2ab40 2e 20 20 2a 2f 0a 20 20 70 54 6f 2d 3e 69 73 49  .  */.  pTo->isI
2ab50 6e 69 74 20 3d 20 30 3b 0a 20 20 54 45 53 54 4f  nit = 0;.  TESTO
2ab60 4e 4c 59 28 72 63 20 3d 20 29 20 73 71 6c 69 74  NLY(rc = ) sqlit
2ab70 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2ab80 70 54 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  pTo);.  assert( 
2ab90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2aba0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
2abb0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
2abc0 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
2abd0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  e the pointer-ma
2abe0 70 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 66  p entries.  ** f
2abf0 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72  or any b-tree or
2ac00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2ac10 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e  that pTo now con
2ac20 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
2ac30 72 73 20 74 6f 2e 20 2a 2f 0a 20 20 69 66 28 20  rs to. */.  if( 
2ac40 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2ac50 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
2ac60 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20  dPtrmaps(pTo);. 
2ac70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ac80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2ac90 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2aca0 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  on the root page
2acb0 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e   of a btree when
2acc0 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
2acd0 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
2ace0 6c 6c 73 2e 20 54 68 69 73 20 69 73 20 61 6e 20  lls. This is an 
2acf0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d  opportunity to m
2ad00 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20  ake the tree.** 
2ad10 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65  shallower by one
2ad20 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
2ad30 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68  c int balance_sh
2ad40 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20  allower(MemPage 
2ad50 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20  *pRoot, MemPage 
2ad60 2a 70 43 68 69 6c 64 29 7b 0a 20 20 2f 2a 20 54  *pChild){.  /* T
2ad70 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2ad80 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e  empty but has on
2ad90 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66  e child.  Transf
2ada0 65 72 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f  er the.  ** info
2adb0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61  rmation from tha
2adc0 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f  t one child into
2add0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
2ade0 66 20 69 74 20 0a 20 20 2a 2a 20 77 69 6c 6c 20  f it .  ** will 
2adf0 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63  fit.  This reduc
2ae00 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  es the depth of 
2ae10 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e  the tree by one.
2ae20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
2ae30 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70  e root page is p
2ae40 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65  age 1, it has le
2ae50 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ss space availab
2ae60 6c 65 20 74 68 61 6e 0a 20 20 2a 2a 20 69 74 73  le than.  ** its
2ae70 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74   child (due to t
2ae80 68 65 20 31 30 30 20 62 79 74 65 20 68 65 61 64  he 100 byte head
2ae90 65 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  er that occurs a
2aea0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
2aeb0 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61    ** of the data
2aec0 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74  base fle), so it
2aed0 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62   might not be ab
2aee0 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f  le to hold all o
2aef0 66 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 66 6f  f the .  ** info
2af00 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  rmation currentl
2af10 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  y contained in t
2af20 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68  he child.  If th
2af30 69 73 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20  is is the .  ** 
2af40 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  case, then do no
2af50 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65  t do the transfe
2af60 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20 31  r.  Leave page 1
2af70 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20   empty except.  
2af80 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ** for the right
2af90 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20  -pointer to the 
2afa0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
2afb0 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f   child page beco
2afc0 6d 65 73 0a 20 20 2a 2a 20 74 68 65 20 76 69 72  mes.  ** the vir
2afd0 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65  tual root of the
2afe0 20 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e   tree..  */.  in
2aff0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b010 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2b020 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2b030 20 63 6f 6e 73 74 20 68 64 72 20 3d 20 70 52 6f   const hdr = pRo
2b040 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ot->hdrOffset;  
2b050 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2b060 74 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 20 68  t of root page h
2b070 65 61 64 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  eader */..  asse
2b080 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b090 78 5f 68 65 6c 64 28 70 52 6f 6f 74 2d 3e 70 42  x_held(pRoot->pB
2b0a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2b0b0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 43  ssert( pRoot->nC
2b0c0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
2b0d0 72 74 28 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  rt( pChild->pgno
2b0e0 3d 3d 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  ==get4byte(&pRoo
2b0f0 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
2b100 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 20 29 3b  hdrOffset+8]) );
2b110 0a 20 20 61 73 73 65 72 74 28 20 68 64 72 3d 3d  .  assert( hdr==
2b120 30 20 7c 7c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  0 || pRoot->pgno
2b130 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ==1 );..  if( pC
2b140 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 68 64 72  hild->nFree>=hdr
2b150 20 29 7b 0a 20 20 20 20 69 66 28 20 68 64 72 20   ){.    if( hdr 
2b160 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65  ){.      rc = de
2b170 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 43 68  fragmentPage(pCh
2b180 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2b190 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b1a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2b1b0 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
2b1c0 70 43 68 69 6c 64 2c 20 70 52 6f 6f 74 29 3b 0a  pChild, pRoot);.
2b1d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b1e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b1f0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2b200 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
2b210 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2b220 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2b230 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
2b240 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e  ributes cells on
2b250 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27   the iParentIdx'
2b260 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  th child of pPar
2b270 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65  ent.** (hereafte
2b280 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e  r "the page") an
2b290 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e  d up to 2 siblin
2b2a0 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  gs so that all p
2b2b0 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
2b2c0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75  the.** same amou
2b2d0 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
2b2e0 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67  . Usually a sing
2b2f0 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69  le sibling on ei
2b300 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65  ther side of the
2b310 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65  .** page are use
2b320 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
2b330 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20  ng, though both 
2b340 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
2b350 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ome from one.** 
2b360 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65  side if the page
2b370 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72   is the first or
2b380 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
2b390 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68  ts parent. If th
2b3a0 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66  e page .** has f
2b3b0 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c  ewer than 2 sibl
2b3c0 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20  ings (something 
2b3d0 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
2b3e0 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67  appen if the pag
2b3f0 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70  e.** is a root p
2b400 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f  age or a child o
2b410 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74  f a root page) t
2b420 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
2b430 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61  e siblings.** pa
2b440 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
2b450 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
2b460 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2b470 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20  siblings of the 
2b480 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  page might be in
2b490 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
2b4a0 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20  ased by .** one 
2b4b0 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  or two in an eff
2b4c0 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
2b4d0 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
2b4e0 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
2b4f0 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
2b500 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
2b510 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
2b520 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
2b530 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
2b540 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
2b550 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
2b560 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e  MemPage.aData[].
2b570 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
2b580 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
2b590 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69  is overfull. Thi
2b5a0 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
2b5b0 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73  s that all cells
2b5c0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f   allocated.** to
2b5d0 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
2b5e0 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69  s siblings fit i
2b5f0 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  nto MemPage.aDat
2b600 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72  a[] before retur
2b610 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ning..**.** In t
2b620 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
2b630 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20  ancing the page 
2b640 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
2b650 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a  , cells may be.*
2b660 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
2b670 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  or removed from 
2b680 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2b690 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67  (pParent). Doing
2b6a0 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65   so.** may cause
2b6b0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2b6c0 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
2b6d0 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
2b6e0 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70  . If this.** hap
2b6f0 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20  pens, it is the 
2b700 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
2b710 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
2b720 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65  invoke the corre
2b730 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20  ct.** balancing 
2b740 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74  routine to fix t
2b750 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65  his problem (see
2b760 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72   the balance() r
2b770 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20  outine). .**.** 
2b780 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
2b790 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
2b7a0 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
2b7b0 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
2b7c0 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
2b7d0 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66  ted state. So if
2b7e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
2b7f0 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
2b800 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
2b810 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
2b820 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75  * The third argu
2b830 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2b840 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63  ction, aOvflSpac
2b850 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
2b860 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 70  to a.** buffer p
2b870 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20 69  age-size bytes i
2b880 6e 20 73 69 7a 65 2e 20 49 66 2c 20 69 6e 20 69  n size. If, in i
2b890 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69  nserting cells i
2b8a0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a  nto the parent.*
2b8b0 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29  * page (pParent)
2b8c0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  , the parent pag
2b8d0 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75  e becomes overfu
2b8e0 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 20  ll, this buffer 
2b8f0 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  is.** used to st
2b900 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 73 20  ore the parents 
2b910 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20  overflow cells. 
2b920 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e  Because this fun
2b930 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a  ction inserts.**
2b940 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f   a maximum of fo
2b950 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ur divider cells
2b960 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
2b970 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d   page, and the m
2b980 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f  aximum.** size o
2b990 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20  f a cell stored 
2b9a0 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e  within an intern
2b9b0 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  al node is alway
2b9c0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a  s less than 1/4.
2b9d0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  ** of the page-s
2b9e0 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70  ize, the aOvflSp
2b9f0 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20  ace[] buffer is 
2ba00 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2ba10 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68   large.** enough
2ba20 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f   for all overflo
2ba30 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  w cells..**.** I
2ba40 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20  f aOvflSpace is 
2ba50 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f  set to a null po
2ba60 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
2ba70 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
2ba80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
2ba90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2baa0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20  ance_nonroot(.  
2bab0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2bac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bad0 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f  /* Parent page o
2bae0 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67  f siblings being
2baf0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
2bb00 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20  nt iParentIdx,  
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bb20 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20  * Index of "the 
2bb30 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74  page" in pParent
2bb40 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53   */.  u8 *aOvflS
2bb50 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
2bb60 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69        /* page-si
2bb70 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
2bb80 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66  e for parent ovf
2bb90 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f  l */.  int isRoo
2bba0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2bbb0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2bbc0 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72  f pParent is a r
2bbd0 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  oot-page */.){. 
2bbe0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bc00 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
2bc10 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
2bc20 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
2bc30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2bc40 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
2bc50 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
2bc60 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
2bc70 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
2bc80 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
2bc90 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
2bca0 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  m. */.  int nNew
2bcb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2bcc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2bcd0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
2bce0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  [] */.  int nOld
2bcf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bd00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2bd10 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
2bd20 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
2bd30 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
2bd40 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2bd50 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  nters */.  int n
2bd60 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
2bd70 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
2bd80 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
2bd90 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
2bda0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2bdb0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2bdc0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
2bdd0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c   code */.  int l
2bde0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
2bdf0 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
2be00 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
2be10 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
2be20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
2be30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2be40 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
2be50 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
2be60 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
2be70 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
2be80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2be90 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
2bea0 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
2beb0 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
2bec0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
2bed0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
2bee0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
2bef0 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
2bf00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bf10 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
2bf20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
2bf30 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
2bf40 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bf60 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
2bf70 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
2bf80 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61  /.  int iOvflSpa
2bf90 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
2bfa0 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
2bfb0 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70   byte of aOvflSp
2bfc0 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ace[] */.  int s
2bfd0 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20  zScratch;       
2bfe0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2bff0 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  of scratch memor
2c000 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  y requested */. 
2c010 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
2c020 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
2c030 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
2c040 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
2c050 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
2c060 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
2c070 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
2c080 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
2c090 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
2c0a0 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
2c0b0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
2c0c0 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
2c0d0 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
2c0e0 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69  ing */.  u8 *pRi
2c0f0 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
2c100 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
2c110 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72  n in parent of r
2c120 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69  ight-sibling poi
2c130 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70  nter */.  u8 *ap
2c140 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20  Div[NB-1];      
2c150 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
2c160 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
2c170 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
2c180 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2c190 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2c1a0 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
2c1b0 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
2c1c0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
2c1d0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
2c1e0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
2c1f0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
2c200 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
2c210 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
2c220 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2c230 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
2c240 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
2c250 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
2c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c270 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
2c280 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2c290 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
2c2a0 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
2c2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
2c2c0 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
2c2d0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
2c2e0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
2c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c300 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20   /* Temp var to 
2c310 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d  store a page num
2c320 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74  ber in */..  pBt
2c330 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b   = pParent->pBt;
2c340 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2c350 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2c360 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2c370 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2c380 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2c390 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
2c3a0 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41   );..#if 0.  TRA
2c3b0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
2c3c0 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
2c3d0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
2c3e0 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
2c3f0 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66  ->pgno));.#endif
2c400 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
2c410 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79  oint pParent may
2c420 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
2c430 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
2c440 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69   And if.  ** thi
2c450 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  s overflow cell 
2c460 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d  is present, it m
2c470 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20  ust be the cell 
2c480 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78  with .  ** index
2c490 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69   iParentIdx. Thi
2c4a0 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73  s scenario comes
2c4b0 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73   about when this
2c4c0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
2c4d0 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65  s called (indire
2c4e0 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74  ctly) from sqlit
2c4f0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e  e3BtreeDelete().
2c500 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2c510 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2c520 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
2c530 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2c540 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
2c550 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
2c560 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  || pParent->aOvf
2c570 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e  l[0].idx==iParen
2c580 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21  tIdx );..  if( !
2c590 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20  aOvflSpace ){.  
2c5a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c5b0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
2c5c0 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e   Find the siblin
2c5d0 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e  g pages to balan
2c5e0 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20  ce. Also locate 
2c5f0 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
2c600 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20  rent .  ** that 
2c610 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69  divide the sibli
2c620 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  ngs. An attempt 
2c630 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
2c640 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a  NN siblings on .
2c650 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65    ** either side
2c660 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20   of pPage. More 
2c670 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
2c680 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
2c690 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a  , however, .  **
2c6a0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65   if there are fe
2c6b0 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
2c6c0 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
2c6d0 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65  r side. If pPare
2c6e0 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
2c6f0 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
2c700 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
2c710 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
2c720 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a  e taken.  .  **.
2c730 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
2c740 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69  lso drops the di
2c750 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
2c760 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c770 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c  . This.  ** way,
2c780 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
2c790 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
2c7a0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
2c7b0 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20  deal with any.  
2c7c0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ** overflow cell
2c7d0 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
2c7e0 70 61 67 65 2c 20 61 73 20 69 66 20 6f 6e 65 20  page, as if one 
2c7f0 65 78 69 73 74 65 64 20 69 74 20 68 61 73 20 61  existed it has a
2c800 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
2c810 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f 0a 20 20   removed.  */.  
2c820 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  i = pParent->nOv
2c830 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74  erflow + pParent
2c840 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69  ->nCell;.  if( i
2c850 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <2 ){.    nxDiv 
2c860 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  = 0;.    nOld = 
2c870 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i+1;.  }else{.  
2c880 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20    nOld = 3;.    
2c890 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
2c8a0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
2c8b0 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69       .      nxDi
2c8c0 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  v = 0;.    }else
2c8d0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
2c8e0 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69  =i ){.      nxDi
2c8f0 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c  v = i-2;.    }el
2c900 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20  se{.      nxDiv 
2c910 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a  = iParentIdx-1;.
2c920 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b      }.    i = 2;
2c930 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78  .  }.  if( (i+nx
2c940 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2c950 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
2c960 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2c970 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
2c980 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2c990 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
2c9a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
2c9b0 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
2c9c0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2c9d0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2c9e0 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
2c9f0 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
2ca00 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
2ca10 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
2ca20 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
2ca30 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a  no, &apOld[i]);.
2ca40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2ca50 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
2ca60 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66 28 4d 65  , 0, i*sizeof(Me
2ca70 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
2ca80 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2ca90 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
2caa0 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
2cab0 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
2cac0 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
2cad0 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
2cae0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
2caf0 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e     if( pParent->
2cb00 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20 69 2b 6e  nOverflow && i+n
2cb10 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61  xDiv==pParent->a
2cb20 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29 7b 0a 20  Ovfl[0].idx ){. 
2cb30 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
2cb40 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2cb50 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70  ].pCell;.      p
2cb60 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
2cb70 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
2cb80 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
2cb90 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2cba0 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2cbb0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2cbc0 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  low = 0;.    }el
2cbd0 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b  se{.      apDiv[
2cbe0 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
2cbf0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2cc00 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2cc10 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  w);.      pgno =
2cc20 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
2cc30 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
2cc40 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
2cc50 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
2cc60 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  [i]);..      /* 
2cc70 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72  Drop the cell fr
2cc80 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2cc90 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69  ge. apDiv[i] sti
2cca0 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20  ll points to.   
2ccb0 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77     ** the cell w
2ccc0 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ithin the parent
2ccd0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
2cce0 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65   has been droppe
2ccf0 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  d..      ** This
2cd00 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
2cd10 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c   dropping a cell
2cd20 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73   only overwrites
2cd30 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
2cd40 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
2cd50 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66  f it, and this f
2cd60 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2cd70 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a   need the first.
2cd80 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
2cd90 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  tes of the divid
2cda0 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20  er cell. So the 
2cdb0 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20  pointer is safe 
2cdc0 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  to use.      ** 
2cdd0 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20  later on.  .    
2cde0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
2cdf0 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 20 63  less SQLite is c
2ce00 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72  ompiled in secur
2ce10 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
2ce20 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20  n this case,.   
2ce30 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
2ce40 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
2ce50 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
2ce60 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
2ce70 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
2ce80 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
2ce90 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
2cea0 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
2ceb0 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
2cec0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
2ced0 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
2cee0 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
2cef0 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
2cf00 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
2cf10 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
2cf20 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  d.  */.#ifdef SQ
2cf30 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
2cf40 54 45 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  TE.      memcpy(
2cf50 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
2cf60 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
2cf70 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  ata], apDiv[i], 
2cf80 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
2cf90 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76   apDiv[i] = &aOv
2cfa0 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
2cfb0 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
2cfc0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  ;.#endif.      d
2cfd0 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
2cfe0 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
2cff0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e  ->nOverflow, szN
2d000 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[i]);.    }.  
2d010 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
2d020 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
2d030 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
2d040 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
2d050 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
2d060 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
2d070 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
2d080 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
2d090 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
2d0a0 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
2d0b0 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20  ctures.  */.  k 
2d0c0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
2d0d0 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  + ROUND8(sizeof(
2d0e0 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53  MemPage));.  szS
2d0f0 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20  cratch =.       
2d100 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2d110 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
2d120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2d130 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  pCell */.     + 
2d140 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2d150 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20  (u16)           
2d160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2d170 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
2d180 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
2d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2d1b0 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
2d1c0 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20   k*nOld;        
2d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d1f0 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43  Page copies (apC
2d200 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  opy) */.  apCell
2d210 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
2d220 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74  hMalloc( szScrat
2d230 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43  ch ); .  if( apC
2d240 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ell==0 ){.    rc
2d250 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2d260 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
2d270 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
2d280 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
2d290 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &apCell[nMaxCell
2d2a0 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20  s];.  aSpace1 = 
2d2b0 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
2d2c0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
2d2d0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2d2e0 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29  IGNMENT(aSpace1)
2d2f0 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c   );..  /*.  ** L
2d300 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
2d310 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
2d320 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
2d330 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2d340 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
2d350 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
2d360 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
2d370 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
2d380 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
2d390 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
2d3a0 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  from aSpace1[] a
2d3b0 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
2d3c0 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
2d3d0 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
2d3e0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
2d3f0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
2d400 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
2d410 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
2d420 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
2d430 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
2d440 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
2d450 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
2d460 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
2d470 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
2d480 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
2d490 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
2d4a0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
2d4b0 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
2d4c0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
2d4d0 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
2d4e0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
2d4f0 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
2d500 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
2d510 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
2d520 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
2d530 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
2d540 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
2d550 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
2d560 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
2d570 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
2d580 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
2d590 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
2d5a0 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
2d5b0 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
2d5c0 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
2d5d0 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
2d5e0 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
2d5f0 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63   */.  leafCorrec
2d600 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  tion = apOld[0]-
2d610 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
2d620 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ata = apOld[0]->
2d630 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
2d640 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
2d650 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b  {.    int limit;
2d660 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66  .    .    /* Bef
2d670 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
2d680 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20  ng else, take a 
2d690 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68  copy of the i'th
2d6a0 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e   original siblin
2d6b0 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  g.    ** The res
2d6c0 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
2d6d0 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
2d6e0 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
2d6f0 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74   rather.    ** t
2d700 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
2d710 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65   pages since the
2d720 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
2d730 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20  will be in the. 
2d740 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66     ** process of
2d750 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
2d760 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  en.  */.    MemP
2d770 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
2d780 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
2d790 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  *)&aSpace1[pBt->
2d7a0 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b  pageSize + k*i];
2d7b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
2d7c0 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
2d7d0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
2d7e0 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20    pOld->aData = 
2d7f0 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b  (void*)&pOld[1];
2d800 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
2d810 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
2d820 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
2d830 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c  ageSize);..    l
2d840 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
2d850 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
2d860 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ow;.    for(j=0;
2d870 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
2d880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2d890 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2d8a0 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
2d8b0 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
2d8c0 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
2d8d0 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
2d8e0 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
2d8f0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
2d900 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
2d910 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
2d920 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
2d930 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20  && !leafData){. 
2d940 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 73 7a       u16 sz = sz
2d950 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38  New[i];.      u8
2d960 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61   *pTemp;.      a
2d970 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
2d980 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
2d990 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
2d9a0 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  sz;.      pTemp 
2d9b0 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63  = &aSpace1[iSpac
2d9c0 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63  e1];.      iSpac
2d9d0 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e1 += sz;.      
2d9e0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
2d9f0 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
2da00 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
2da10 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ace1<=pBt->pageS
2da20 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ize );.      mem
2da30 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76  cpy(pTemp, apDiv
2da40 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  [i], sz);.      
2da50 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
2da60 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
2da70 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  tion;.      asse
2da80 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
2da90 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72  on==0 || leafCor
2daa0 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
2dab0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2dac0 5d 20 2d 3d 20 28 75 31 36 29 6c 65 61 66 43 6f  ] -= (u16)leafCo
2dad0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
2dae0 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
2daf0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2db00 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
2db10 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2db20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64  assert( pOld->hd
2db30 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20  rOffset==0 );.  
2db40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
2db50 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
2db60 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
2db70 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
2db80 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  ft.        ** po
2db90 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
2dba0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
2dbb0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65       memcpy(apCe
2dbc0 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64  ll[nCell], &pOld
2dbd0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
2dbe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2dbf0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
2dc00 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
2dc10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
2dc20 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b  Cell[nCell]<4 ){
2dc30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
2dc40 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
2dc50 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
2dc60 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
2dc70 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
2dc80 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
2dc90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2dca0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
2dcb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
2dcc0 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
2dcd0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2dce0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
2dcf0 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
2dd00 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
2dd10 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
2dd20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
2dd30 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
2dd40 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
2dd50 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
2dd60 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
2dd70 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
2dd80 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
2dd90 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
2dda0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
2ddb0 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
2ddc0 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
2ddd0 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
2dde0 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
2ddf0 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
2de00 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
2de10 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
2de20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
2de30 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
2de40 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
2de50 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
2de60 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
2de70 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
2de80 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
2de90 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
2dea0 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
2deb0 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
2dec0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
2ded0 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
2dee0 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
2def0 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
2df00 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
2df10 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
2df20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2df30 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
2df40 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
2df50 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
2df60 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
2df70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
2df80 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
2df90 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
2dfa0 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
2dfb0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
2dfc0 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
2dfd0 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
2dfe0 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
2dff0 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
2e000 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
2e010 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
2e020 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
2e030 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
2e040 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
2e050 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
2e060 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
2e070 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
2e080 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
2e090 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b     if( k>NB+1 ){
2e0a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2e0b0 52 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e  RUPT; goto balan
2e0c0 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20  ce_cleanup; }.  
2e0d0 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
2e0e0 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
2e0f0 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
2e100 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
2e110 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
2e120 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
2e130 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
2e140 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
2e150 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
2e160 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
2e170 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
2e180 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
2e190 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
2e1a0 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
2e1b0 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
2e1c0 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
2e1d0 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
2e1e0 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
2e1f0 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
2e200 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
2e210 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
2e220 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
2e230 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
2e240 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
2e250 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
2e260 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
2e270 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
2e280 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
2e290 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
2e2a0 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
2e2b0 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
2e2c0 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
2e2d0 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
2e2e0 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
2e2f0 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
2e300 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
2e310 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
2e320 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
2e330 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
2e340 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
2e350 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
2e360 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
2e370 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
2e380 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
2e390 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
2e3a0 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
2e3b0 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
2e3c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2e3d0 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
2e3e0 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
2e3f0 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
2e400 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
2e410 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2e420 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
2e430 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
2e440 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
2e450 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
2e460 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
2e470 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
2e480 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
2e490 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2e4a0 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
2e4b0 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
2e4c0 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  ( szRight==0 || 
2e4d0 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
2e4e0 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
2e4f0 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20  ell[r]+2) ){.   
2e500 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
2e510 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
2e520 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
2e530 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
2e540 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
2e550 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
2e560 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
2e570 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
2e580 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
2e590 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
2e5a0 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
2e5b0 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
2e5c0 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
2e5d0 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
2e5e0 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
2e5f0 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61  ew[0])>0) or pPa
2e600 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72  ge is.  ** a vir
2e610 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
2e620 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
2e630 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
2e640 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
2e650 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
2e660 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
2e670 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
2e680 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
2e690 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
2e6a0 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
2e6b0 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
2e6c0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
2e6d0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
2e6e0 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25  CE: old: %d %d %
2e6f0 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b  d  ",.    apOld[
2e700 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e  0]->pgno, .    n
2e710 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31  Old>=2 ? apOld[1
2e720 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20  ]->pgno : 0,.   
2e730 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64   nOld>=3 ? apOld
2e740 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20  [2]->pgno : 0.  
2e750 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ));..  /*.  ** A
2e760 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61  llocate k new pa
2e770 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20  ges.  Reuse old 
2e780 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73  pages where poss
2e790 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ible..  */.  if(
2e7a0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c   apOld[0]->pgno<
2e7b0 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =1 ){.    rc = S
2e7c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
2e7d0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2e7e0 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
2e7f0 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
2e800 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
2e810 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2e820 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
2e830 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
2e840 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
2e850 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
2e860 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
2e870 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
2e880 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e890 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
2e8a0 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
2e8b0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
2e8c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2e8d0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2e8e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e8f0 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
2e900 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2e910 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2e920 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
2e930 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
2e940 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2e950 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2e960 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
2e970 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
2e980 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  ++;..      /* Se
2e990 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
2e9a0 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  p entry for the 
2e9b0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
2e9c0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49  . */.      if( I
2e9d0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2e9e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2e9f0 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d  apPut(pBt, pNew-
2ea00 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2ea10 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
2ea20 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
2ea30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ea40 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2ea50 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2ea60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ea70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ea80 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
2ea90 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
2eaa0 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
2eab0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
2eac0 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
2ead0 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
2eae0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2eaf0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2eb00 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2eb10 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
2eb20 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
2eb30 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
2eb40 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
2eb50 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
2eb60 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
2eb70 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
2eb80 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
2eb90 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
2eba0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
2ebb0 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
2ebc0 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
2ebd0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
2ebe0 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
2ebf0 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
2ec00 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
2ec10 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
2ec20 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
2ec30 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
2ec40 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
2ec50 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
2ec60 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
2ec70 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
2ec80 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
2ec90 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
2eca0 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
2ecb0 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
2ecc0 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
2ecd0 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
2ece0 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
2ecf0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
2ed00 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
2ed10 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
2ed20 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
2ed30 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
2ed40 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
2ed50 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
2ed60 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
2ed70 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
2ed80 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
2ed90 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  nV = apNew[i]->p
2eda0 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  gno;.    int min
2edb0 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
2edc0 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
2edd0 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
2ede0 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67  [j]->pgno<(unsig
2edf0 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
2ee00 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
2ee10 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e        minV = apN
2ee20 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[j]->pgno;.   
2ee30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2ee40 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
2ee50 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
2ee60 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
2ee70 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d     t = apNew[i]-
2ee80 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20  >pgno;.      pT 
2ee90 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
2eea0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
2eeb0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
2eec0 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
2eed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
2eee0 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64  ACE(("new: %d(%d
2eef0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
2ef00 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
2ef10 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e  ,.    apNew[0]->
2ef20 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  pgno, szNew[0],.
2ef30 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70      nNew>=2 ? ap
2ef40 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[1]->pgno : 0
2ef50 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
2ef60 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
2ef70 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d  ew>=3 ? apNew[2]
2ef80 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
2ef90 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
2efa0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
2efb0 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f  ? apNew[3]->pgno
2efc0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
2efd0 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
2efe0 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65    nNew>=5 ? apNe
2eff0 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[4]->pgno : 0, 
2f000 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
2f010 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73  4] : 0));..  ass
2f020 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2f030 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2f040 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2f050 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69  ;.  put4byte(pRi
2f060 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d  ght, apNew[nNew-
2f070 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  1]->pgno);..  /*
2f080 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
2f090 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
2f0a0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
2f0b0 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
2f0c0 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
2f0d0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
2f0e0 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
2f0f0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
2f100 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
2f110 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
2f120 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
2f130 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
2f140 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
2f150 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
2f160 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
2f170 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
2f180 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
2f190 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
2f1a0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2f1b0 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
2f1c0 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
2f1d0 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
2f1e0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
2f1f0 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
2f200 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
2f210 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
2f220 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
2f230 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20  ow==0 );..    j 
2f240 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
2f250 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
2f260 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
2f270 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
2f280 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2f290 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
2f2a0 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
2f2b0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
2f2c0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
2f2d0 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65  */.    if( i<nNe
2f2e0 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29  w-1 && j<nCell )
2f2f0 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
2f300 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  l;.      u8 *pTe
2f310 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  mp;.      int sz
2f320 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
2f330 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
2f340 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70        pCell = ap
2f350 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  Cell[j];.      s
2f360 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20  z = szCell[j] + 
2f370 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
2f380 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
2f390 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53  OvflSpace[iOvflS
2f3a0 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28  pace];.      if(
2f3b0 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a   !pNew->leaf ){.
2f3c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2f3d0 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pNew->aData[8], 
2f3e0 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20  pCell, 4);.     
2f3f0 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44   }else if( leafD
2f400 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
2f410 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73  * If the tree is
2f420 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
2f430 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69  e, and the sibli
2f440 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20  ngs are leaves, 
2f450 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2f460 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76   there is no div
2f470 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43  ider cell in apC
2f480 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20  ell[]. Instead, 
2f490 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20  the divider .   
2f4a0 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e       ** cell con
2f4b0 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74  sists of the int
2f4c0 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65  eger key for the
2f4d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
2f4e0 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   of .        ** 
2f4f0 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65  the sibling-page
2f500 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
2f510 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a   only..        *
2f520 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  /.        CellIn
2f530 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
2f540 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71   j--;.        sq
2f550 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
2f560 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
2f570 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
2f580 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2f590 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73  pTemp;.        s
2f5a0 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e  z = 4 + putVarin
2f5b0 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66  t(&pCell[4], inf
2f5c0 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  o.nKey);.       
2f5d0 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
2f5e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f5f0 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
2f600 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
2f610 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
2f620 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
2f630 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
2f640 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
2f650 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
2f660 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
2f670 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
2f680 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
2f690 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
2f6a0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
2f6b0 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
2f6c0 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
2f6d0 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c       ** (see sql
2f6e0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
2f6f0 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
2f700 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
2f710 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
2f720 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
2f730 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
2f740 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
2f750 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
2f760 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
2f770 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
2f780 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
2f790 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2f7a0 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
2f7b0 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
2f7c0 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
2f7d0 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
2f7e0 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
2f7f0 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
2f800 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
2f810 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
2f820 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
2f830 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
2f840 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
2f850 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
2f860 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
2f870 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2f880 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
2f890 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2f8a0 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
2f8b0 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
2f8c0 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
2f8d0 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
2f8e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f8f0 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c     }.      iOvfl
2f900 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
2f910 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
2f920 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
2f930 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2f940 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42 74 2d  iOvflSpace<=pBt-
2f950 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
2f960 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
2f970 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
2f980 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
2f990 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  emp, pNew->pgno)
2f9a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2f9b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2f9c0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2f9d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2f9e0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2f9f0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2fa00 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2fa10 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e      j++;.      n
2fa20 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  xDiv++;.    }.  
2fa30 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
2fa40 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
2fa50 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73  ( nOld>0 );.  as
2fa60 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
2fa70 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73    if( (pageFlags
2fa80 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20   & PTF_LEAF)==0 
2fa90 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c  ){.    u8 *zChil
2faa0 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64  d = &apCopy[nOld
2fab0 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20  -1]->aData[8];. 
2fac0 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77     memcpy(&apNew
2fad0 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nNew-1]->aData[
2fae0 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a  8], zChild, 4);.
2faf0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
2fb00 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2fb10 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
2fb20 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72  e cells that wer
2fb30 65 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64  e shifted around
2fb40 2e 20 0a 20 20 2a 2a 20 54 68 65 72 65 20 61 72  . .  ** There ar
2fb50 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  e several differ
2fb60 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69  ent types of poi
2fb70 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2fb80 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20   that need to.  
2fb90 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
2fba0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
2fbb0 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
2fbc0 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
2fbd0 72 65 61 64 79 2c 20 62 75 74 0a 20 20 2a 2a 20  ready, but.  ** 
2fbe0 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54  many have not. T
2fbf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
2fc00 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 2a 2a 0a  a summary:.  **.
2fc10 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e    **   1) The en
2fc20 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
2fc30 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e   with new siblin
2fc40 67 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  g pages that wer
2fc50 65 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20  e not.  **      
2fc60 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68  siblings when th
2fc70 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
2fc80 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61  called. These ha
2fc90 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
2fca0 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57       been set. W
2fcb0 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20  e don't need to 
2fcc0 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20  worry about old 
2fcd0 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
2fce0 72 65 0a 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76  re.  **      mov
2fcf0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
2fd00 69 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61  ist - the freePa
2fd10 67 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61  ge() code has ta
2fd20 6b 65 6e 20 63 61 72 65 0a 20 20 2a 2a 20 20 20  ken care.  **   
2fd30 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 2a     of those..  *
2fd40 2a 0a 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20  *.  **   2) The 
2fd50 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2fd60 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
2fd70 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76  ith the first ov
2fd80 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 20 20 20 20  erflow.  **     
2fd90 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65   page in any ove
2fda0 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65  rflow chains use
2fdb0 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72  d by new divider
2fdc0 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20   cells. These . 
2fdd0 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c   **      have al
2fde0 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  so already been 
2fdf0 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79  taken care of by
2fe00 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
2fe10 29 20 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ) code..  **.  *
2fe20 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73 69  *   3) If the si
2fe30 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
2fe40 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
2fe50 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73   the child pages
2fe60 20 6f 66 0a 20 20 2a 2a 20 20 20 20 20 20 63 65   of.  **      ce
2fe70 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  lls stored on th
2fe80 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
2fe90 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
2fea0 70 64 61 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  pdated..  **.  *
2feb0 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
2fec0 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
2fed0 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
2fee0 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
2fef0 61 6e 79 0a 20 20 2a 2a 20 20 20 20 20 20 6f 76  any.  **      ov
2ff00 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65  erflow pages use
2ff10 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73  d by these cells
2ff20 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
2ff30 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 20 20 20  updated.  **    
2ff40 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b    (internal intk
2ff50 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63  ey nodes never c
2ff60 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
2ff70 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
2ff80 73 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  s)..  **.  **   
2ff90 35 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  5) If the siblin
2ffa0 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
2ffb0 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65  leaves, then the
2ffc0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
2ffd0 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20 66  *      entries f
2ffe0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  or the right-chi
2fff0 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63 68  ld pages of each
30000 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65   sibling may nee
30010 64 0a 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62  d.  **      to b
30020 65 20 75 70 64 61 74 65 64 2e 0a 20 20 2a 2a 0a  e updated..  **.
30030 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
30040 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
30050 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
30060 20 63 6f 64 65 2e 20 54 68 65 20 66 6f 6c 6c 6f   code. The follo
30070 77 69 6e 67 0a 20 20 2a 2a 20 62 6c 6f 63 6b 20  wing.  ** block 
30080 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65 73  deals with cases
30090 20 33 20 61 6e 64 20 34 2e 20 53 69 6e 63 65 20   3 and 4. Since 
300a0 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65  setting a pointe
300b0 72 20 6d 61 70 20 65 6e 74 72 79 0a 20 20 2a 2a  r map entry.  **
300c0 20 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79   is a relatively
300d0 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
300e0 74 69 6f 6e 2c 20 74 68 69 73 20 63 6f 64 65 20  tion, this code 
300f0 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65  only sets pointe
30100 72 0a 20 20 2a 2a 20 6d 61 70 20 65 6e 74 72 69  r.  ** map entri
30110 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
30120 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
30130 68 61 74 20 68 61 76 65 20 61 63 74 75 61 6c 6c  hat have actuall
30140 79 20 6d 6f 76 65 64 0a 20 20 2a 2a 20 62 65 74  y moved.  ** bet
30150 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a  ween pages.  */.
30160 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
30170 55 4d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  UM ){.    MemPag
30180 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
30190 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  0];.    MemPage 
301a0 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30  *pOld = apCopy[0
301b0 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72  ];.    int nOver
301c0 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
301d0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20  erflow;.    int 
301e0 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d  iNextOld = pOld-
301f0 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c  >nCell + nOverfl
30200 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65  ow;.    int iOve
30210 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c  rflow = (nOverfl
30220 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  ow ? pOld->aOvfl
30230 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20  [0].idx : -1);. 
30240 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20     j = 0;       
30250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30260 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
30270 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70   'old' sibling p
30280 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30  age */.    k = 0
30290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
302a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
302b0 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73   Current 'new' s
302c0 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
302d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
302e0 65 6c 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ell && rc==SQLIT
302f0 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
30300 20 20 69 6e 74 20 69 73 44 69 76 69 64 65 72 20    int isDivider 
30310 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 0;.      while
30320 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b  ( i==iNextOld ){
30330 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  .        /* Cell
30340 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69   i is the cell i
30350 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
30360 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65  wing the last ce
30370 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20  ll on old.      
30380 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67    ** sibling pag
30390 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c  e j. If the sibl
303a0 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
303b0 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20  f pages of an.  
303c0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20        ** intkey 
303d0 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c  b-tree, then cel
303e0 6c 20 69 20 77 61 73 20 61 20 64 69 76 69 64 65  l i was a divide
303f0 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  r cell. */.     
30400 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79     pOld = apCopy
30410 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  [++j];.        i
30420 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c  NextOld = i + !l
30430 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e  eafData + pOld->
30440 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f  nCell + pOld->nO
30450 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20  verflow;.       
30460 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72   if( pOld->nOver
30470 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
30480 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f    nOverflow = pO
30490 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
304a0 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c           iOverfl
304b0 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ow = i + !leafDa
304c0 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  ta + pOld->aOvfl
304d0 5b 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 20  [0].idx;.       
304e0 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69 76   }.        isDiv
304f0 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61  ider = !leafData
30500 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;  .      }..   
30510 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66     assert(nOverf
30520 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c  low>0 || iOverfl
30530 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73  ow<i );.      as
30540 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32  sert(nOverflow<2
30550 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b   || pOld->aOvfl[
30560 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f  0].idx==pOld->aO
30570 76 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20  vfl[1].idx-1);. 
30580 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
30590 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d  rflow<3 || pOld-
305a0 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70  >aOvfl[1].idx==p
305b0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64  Old->aOvfl[2].id
305c0 78 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x-1);.      if( 
305d0 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  i==iOverflow ){.
305e0 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65          isDivide
305f0 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  r = 1;.        i
30600 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29  f( (--nOverflow)
30610 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
30620 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  iOverflow++;.   
30630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
30640 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74        if( i==cnt
30650 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20  New[k] ){.      
30660 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74    /* Cell i is t
30670 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  he cell immediat
30680 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
30690 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e  e last cell on n
306a0 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  ew.        ** si
306b0 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66  bling page k. If
306c0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
306d0 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73  e not leaf pages
306e0 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a   of an.        *
306f0 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c  * intkey b-tree,
30700 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20   then cell i is 
30710 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  a divider cell. 
30720 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
30730 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20   = apNew[++k];. 
30740 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66         if( !leaf
30750 44 61 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Data ) continue;
30760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
30770 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
30780 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
30790 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a  sert( j<nOld );.
307a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
307b0 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f  nNew );..      /
307c0 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61  * If the cell wa
307d0 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76  s originally div
307e0 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69  ider cell (and i
307f0 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20  s not now) or.  
30800 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c      ** an overfl
30810 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74  ow cell, or if t
30820 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61  he cell was loca
30830 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ted on a differe
30840 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20  nt sibling.     
30850 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20   ** page before 
30860 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  the balancing, t
30870 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20  hen the pointer 
30880 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
30890 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ciated.      ** 
308a0 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f  with any child o
308b0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
308c0 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
308d0 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
308e0 66 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20  f( isDivider || 
308f0 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  pOld->pgno!=pNew
30900 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
30910 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
30920 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
30930 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
30940 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
30950 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d  apCell[i]), PTRM
30960 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
30970 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  pgno);.        }
30980 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
30990 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e  ell[i]>pNew->min
309a0 4c 6f 63 61 6c 20 26 26 20 72 63 3d 3d 53 51 4c  Local && rc==SQL
309b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
309c0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
309d0 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20  utOvflPtr(pNew, 
309e0 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  apCell[i]);.    
309f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30a00 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65    }..    if( !le
30a10 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
30a20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
30a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
30a40 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
30a50 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
30a60 70 50 75 74 28 0a 09 20 20 20 20 70 42 74 2c 20  pPut(..    pBt, 
30a70 67 65 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b  get4byte(&apNew[
30a80 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 50  i]->aData[8]), P
30a90 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e  TRMAP_BTREE, apN
30aa0 65 77 5b 69 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20  ew[i]->pgno);.  
30ab0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
30ac0 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74   0.    /* The pt
30ad0 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 29  rmapCheckPages()
30ae0 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74   contains assert
30af0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  () statements th
30b00 61 74 20 76 65 72 69 66 79 20 74 68 61 74 0a 20  at verify that. 
30b10 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65     ** all pointe
30b20 72 20 6d 61 70 20 70 61 67 65 73 20 61 72 65 20  r map pages are 
30b30 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 54  set correctly. T
30b40 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c 20 77  his is helpful w
30b50 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65 62  hile .    ** deb
30b60 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69 73 20  ugging. This is 
30b70 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c 65 64  usually disabled
30b80 20 62 65 63 61 75 73 65 20 61 20 63 6f 72 72 75   because a corru
30b90 70 74 20 64 61 74 61 62 61 73 65 20 6d 61 79 0a  pt database may.
30ba0 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 20      ** cause an 
30bb0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
30bc0 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a  nt to fail.  */.
30bd0 20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50      ptrmapCheckP
30be0 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77  ages(apNew, nNew
30bf0 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65  );.    ptrmapChe
30c00 63 6b 50 61 67 65 73 28 26 70 50 61 72 65 6e 74  ckPages(&pParent
30c10 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 1);.#endif.  }
30c20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
30c30 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ent->isInit );. 
30c40 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
30c50 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d  : finished: old=
30c60 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d  %d new=%d cells=
30c70 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
30c80 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
30c90 6c 6c 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ll));..  if( rc=
30ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
30cb0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  arent->nCell==0 
30cc0 26 26 20 69 73 52 6f 6f 74 20 29 7b 0a 20 20 20  && isRoot ){.   
30cd0 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
30ce0 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
30cf0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  now contains no 
30d00 63 65 6c 6c 73 2e 20 49 66 20 74 68 65 20 72 6f  cells. If the ro
30d10 6f 74 2d 70 61 67 65 20 0a 20 20 20 20 2a 2a 20  ot-page .    ** 
30d20 69 73 20 6e 6f 74 20 61 6c 73 6f 20 61 20 6c 65  is not also a le
30d30 61 66 20 70 61 67 65 2c 20 69 74 20 77 69 6c 6c  af page, it will
30d40 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 63   have a single c
30d50 68 69 6c 64 20 70 61 67 65 2e 20 43 61 6c 6c 20  hild page. Call 
30d60 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f  .    ** balance_
30d70 73 68 61 6c 6c 6f 77 65 72 20 74 6f 20 61 74 74  shallower to att
30d80 65 6d 70 74 20 74 6f 20 63 6f 70 79 20 74 68 65  empt to copy the
30d90 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
30da0 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a 2a 20 63   single.    ** c
30db0 68 69 6c 64 2d 70 61 67 65 20 69 6e 74 6f 20 74  hild-page into t
30dc0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 28 74 68  he root page (th
30dd0 69 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f  is may not be po
30de0 73 73 69 62 6c 65 20 69 66 20 74 68 65 0a 20 20  ssible if the.  
30df0 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69    ** root page i
30e00 73 20 70 61 67 65 20 31 29 2e 20 20 2a 2f 20 0a  s page 1).  */ .
30e10 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77      assert( nNew
30e20 3d 3d 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==1 );.    rc = 
30e30 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
30e40 72 28 70 50 61 72 65 6e 74 2c 20 61 70 4e 65 77  r(pParent, apNew
30e50 5b 30 5d 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a  [0]);.  }. .  /*
30e60 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65  .  ** Cleanup be
30e70 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
30e80 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65    */.balance_cle
30e90 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53  anup:.  sqlite3S
30ea0 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c  cratchFree(apCel
30eb0 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l);.  for(i=0; i
30ec0 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
30ed0 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
30ee0 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f  ld[i]);.  }.  fo
30ef0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
30f00 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
30f10 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  Page(apNew[i]);.
30f20 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
30f30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
30f40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30f50 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f  led when the roo
30f60 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
30f70 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 0a  ee structure is.
30f80 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73  ** overfull (has
30f90 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
30fa0 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a  rflow pages)..**
30fb0 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20  .** A new child 
30fc0 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
30fd0 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  d and the conten
30fe0 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ts of the curren
30ff0 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20  t root.** page, 
31000 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c  including overfl
31010 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f  ow cells, are co
31020 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68  pied into the ch
31030 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a  ild. The root.**
31040 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76   page is then ov
31050 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b  erwritten to mak
31060 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61  e it an empty pa
31070 67 65 20 77 69 74 68 20 74 68 65 20 72 69 67 68  ge with the righ
31080 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e  t-child .** poin
31090 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ter pointing to 
310a0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a  the new page..**
310b0 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
310c0 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65  ning, all pointe
310d0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
310e0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
310f0 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74 68  ages .** that th
31100 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67 65  e new child-page
31110 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f   now contains po
31120 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75 70  inters to are up
31130 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e  dated. The.** en
31140 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  try correspondin
31150 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69 67  g to the new rig
31160 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
31170 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20   of the root.** 
31180 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70 64  page is also upd
31190 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ated..**.** If s
311a0 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43 68  uccessful, *ppCh
311b0 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63 6f  ild is set to co
311c0 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  ntain a referenc
311d0 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 0a  e to the child .
311e0 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c 49  ** page and SQLI
311f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
31200 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
31210 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
31220 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c  quired.** to cal
31230 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 20  l releasePage() 
31240 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61 63  on *ppChild exac
31250 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20  tly once. If an 
31260 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
31270 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
31280 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
31290 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74  ppChild is set t
312a0 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 0..*/.static i
312b0 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
312c0 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74  r(MemPage *pRoot
312d0 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43 68  , MemPage **ppCh
312e0 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ild){.  int rc; 
312f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31300 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
31310 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70   value from subp
31320 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d  rocedures */.  M
31330 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d  emPage *pChild =
31340 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
31350 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65   Pointer to a ne
31360 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
31370 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
31380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31390 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
313a0 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  of the new child
313b0 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61   page */.  BtSha
313c0 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74  red *pBt = pRoot
313d0 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65  ->pBt;    /* The
313e0 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73   BTree */..  ass
313f0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  ert( pRoot->nOve
31400 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73  rflow>0 );.  ass
31410 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
31420 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
31430 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  ex) );..  /* Mak
31440 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f  e pRoot, the roo
31450 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
31460 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e 20  tree, writable. 
31470 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 0a  Allocate a new .
31480 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 77    ** page that w
31490 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
314a0 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  ew right-child o
314b0 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74 68  f pPage. Copy th
314c0 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20  e contents.  ** 
314d0 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f 72  of the node stor
314e0 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f  ed on pRoot into
314f0 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
31500 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
31510 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
31520 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31530 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  te(pRoot->pDbPag
31540 65 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  e)).   || SQLITE
31550 5f 4f 4b 21 3d 28 72 63 20 3d 20 61 6c 6c 6f 63  _OK!=(rc = alloc
31560 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
31570 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68  ,&pChild,&pgnoCh
31580 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c  ild,pRoot->pgno,
31590 30 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  0)).   || SQLITE
315a0 5f 4f 4b 21 3d 28 72 63 20 3d 20 63 6f 70 79 4e  _OK!=(rc = copyN
315b0 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74  odeContent(pRoot
315c0 2c 20 70 43 68 69 6c 64 29 29 0a 20 20 20 7c 7c  , pChild)).   ||
315d0 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26   (ISAUTOVACUUM &
315e0 26 20 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  & .       SQLITE
315f0 5f 4f 4b 21 3d 28 72 63 20 3d 20 70 74 72 6d 61  _OK!=(rc = ptrma
31600 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 43 68  pPut(pBt, pgnoCh
31610 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  ild, PTRMAP_BTRE
31620 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 29 29  E, pRoot->pgno))
31630 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 70 43 68  ).  ){.    *ppCh
31640 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ild = 0;.    rel
31650 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
31660 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
31670 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
31680 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
31690 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
316a0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
316b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
316c0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f  rIswriteable(pRo
316d0 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ot->pDbPage) );.
316e0 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
316f0 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e  ->nCell==pRoot->
31700 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43  nCell );..  TRAC
31710 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70  E(("BALANCE: cop
31720 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25  y root %d into %
31730 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e  d\n", pRoot->pgn
31740 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  o, pChild->pgno)
31750 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68  );..  /* Copy th
31760 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  e overflow cells
31770 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70   from pRoot to p
31780 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70  Child */.  memcp
31790 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c  y(pChild->aOvfl,
317a0 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70   pRoot->aOvfl, p
317b0 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a  Root->nOverflow*
317c0 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f  sizeof(pRoot->aO
317d0 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69  vfl[0]));.  pChi
317e0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ld->nOverflow = 
317f0 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pRoot->nOverflow
31800 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
31810 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f   contents of pRo
31820 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c  ot. Then install
31830 20 70 43 68 69 6c 64 20 61 73 20 74 68 65 20 72   pChild as the r
31840 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20  ight-child. */. 
31850 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c   zeroPage(pRoot,
31860 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
31870 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a  ] & ~PTF_LEAF);.
31880 20 20 70 75 74 34 62 79 74 65 28 26 70 52 6f 6f    put4byte(&pRoo
31890 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
318a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
318b0 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70  noChild);..  *pp
318c0 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a  Child = pChild;.
318d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
318e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
318f0 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20   page that pCur 
31900 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
31910 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65   to has just bee
31920 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a  n modified in.**
31930 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20   some way. This 
31940 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73  function figures
31950 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64   out if this mod
31960 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20  ification means 
31970 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64  the.** tree need
31980 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64  s to be balanced
31990 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c  , and if so call
319a0 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  s the appropriat
319b0 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20  e balancing .** 
319c0 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69  routine. Balanci
319d0 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 3a  ng routines are:
319e0 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  .**.**   balance
319f0 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61  _quick().**   ba
31a00 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a 2a  lance_deeper().*
31a10 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  *   balance_nonr
31a20 6f 6f 74 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 62  oot().**.** If b
31a30 75 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54 45  uilt with SQLITE
31a40 5f 44 45 42 55 47 2c 20 70 43 75 72 2d 3e 70 61  _DEBUG, pCur->pa
31a50 67 65 73 53 68 75 66 66 6c 65 64 20 69 73 20 73  gesShuffled is s
31a60 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 0a 2a  et to true if .*
31a70 2a 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  * balance_shallo
31a80 77 65 72 28 29 2c 20 62 61 6c 61 6e 63 65 5f 64  wer(), balance_d
31a90 65 65 70 65 72 28 29 20 6f 72 20 62 61 6c 61 6e  eeper() or balan
31aa0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 69 73 20  ce_nonroot() is 
31ab0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 6e 6f  called..** If no
31ac0 6e 65 20 6f 66 20 74 68 65 73 65 20 66 75 6e 63  ne of these func
31ad0 74 69 6f 6e 73 20 61 72 65 20 69 6e 76 6f 6b 65  tions are invoke
31ae0 64 2c 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  d, pCur->pagesSh
31af0 75 66 66 6c 65 64 20 69 73 20 6c 65 66 74 0a 2a  uffled is left.*
31b00 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  * unmodified..*/
31b10 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
31b20 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nce(BtCursor *pC
31b30 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ur){.  int rc = 
31b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e  SQLITE_OK;.  con
31b50 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43  st int nMin = pC
31b60 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ur->pBt->usableS
31b70 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75  ize * 2 / 3;.  u
31b80 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  8 aBalanceQuickS
31b90 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a  pace[13];.  u8 *
31ba0 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45  pFree = 0;..  TE
31bb0 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61  STONLY( int bala
31bc0 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
31bd0 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e   = 0 );.  TESTON
31be0 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
31bf0 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20  deeper_called = 
31c00 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20  0 );..  do {.   
31c10 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
31c20 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65  r->iPage;.    Me
31c30 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
31c40 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
31c50 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61  e];..    if( iPa
31c60 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ge==0 ){.      i
31c70 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
31c80 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  low ){.        /
31c90 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
31ca0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  of the b-tree is
31cb0 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68   overfull. In th
31cc0 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65  is case call the
31cd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61  .        ** bala
31ce0 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e  nce_deeper() fun
31cf0 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ction to create 
31d00 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20  a new child for 
31d10 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
31d20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70        ** and cop
31d30 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  y the current co
31d40 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ntents of the ro
31d50 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54  ot-page to it. T
31d60 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  he.        ** ne
31d70 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
31d80 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
31d90 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69   balance the chi
31da0 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ld page..       
31db0 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73   */ .        ass
31dc0 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65  ert( (balance_de
31dd0 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  eper_called++)==
31de0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
31df0 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
31e00 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61  (pPage, &pCur->a
31e10 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20  pPage[1]);.     
31e20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31e30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31e40 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
31e50 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  1;.          pCu
31e60 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
31e70 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
31e80 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20  >aiIdx[1] = 0;. 
31e90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31ea0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d   pCur->apPage[1]
31eb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
31ec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31ed0 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d   VVA_ONLY( pCur-
31ee0 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d  >pagesShuffled =
31ef0 20 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   1 );.      }els
31f00 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e{.        break
31f10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
31f20 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  lse if( pPage->n
31f30 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70  Overflow==0 && p
31f40 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69  Page->nFree<=nMi
31f50 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  n ){.      break
31f60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31f70 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e     MemPage * con
31f80 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75  st pParent = pCu
31f90 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d  r->apPage[iPage-
31fa0 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  1];.      int co
31fb0 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d  nst iIdx = pCur-
31fc0 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b  >aiIdx[iPage-1];
31fd0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
31fe0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31ff0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
32000 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
32010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
32020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32030 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20  _QUICKBALANCE.  
32040 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
32050 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20  >hasData.       
32060 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65    && pPage->nOve
32070 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20  rflow==1.       
32080 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66    && pPage->aOvf
32090 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d  l[0].idx==pPage-
320a0 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  >nCell.         
320b0 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  && pParent->pgno
320c0 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=1.         && 
320d0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
320e0 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a  iIdx.        ){.
320f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c            /* Cal
32100 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
32110 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  ) to create a ne
32120 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61  w sibling of pPa
32130 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20  ge on which.    
32140 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72        ** to stor
32150 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
32160 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69  ell. balance_qui
32170 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e  ck() inserts a n
32180 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20  ew cell.        
32190 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e    ** into pParen
321a0 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
321b0 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66  se pParent overf
321c0 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20  low. If this.   
321d0 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e         ** happen
321e0 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65  s, the next inte
321f0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
32200 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e  -loop will balan
32210 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20  ce pParent .    
32220 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74        ** use eit
32230 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  her balance_nonr
32240 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65  oot() or balance
32250 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c  _deeper(). Until
32260 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
32270 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20  ** happens, the 
32280 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
32290 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
322a0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
322b0 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e[].          **
322c0 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20   buffer. .      
322d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
322e0 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20   ** The purpose 
322f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
32300 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20   assert() is to 
32310 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20  check that only 
32320 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
32330 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61  ingle call to ba
32340 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
32350 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63   made for each c
32360 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20  all to this.    
32370 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
32380 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20  n. If this were 
32390 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61 20  not verified, a 
323a0 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c  subtle bug invol
323b0 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20  ving reuse.     
323c0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61       ** of the a
323d0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
323e0 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  e[] might sneak 
323f0 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  in..          */
32400 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
32410 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63  t( (balance_quic
32420 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  k_called++)==0 )
32430 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
32440 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70   balance_quick(p
32450 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61  Parent, pPage, a
32460 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
32470 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
32480 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
32490 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {.          /* 
324a0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63 61  In this case, ca
324b0 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ll balance_nonro
324c0 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72 69  ot() to redistri
324d0 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20  bute cells.     
324e0 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
324f0 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
32500 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67  2 of its sibling
32510 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76   pages. This inv
32520 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20 20  olves.          
32530 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  ** modifying the
32540 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61   contents of pPa
32550 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
32560 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f  cause pParent to
32570 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
32580 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
32590 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20   underfull. The 
325a0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
325b0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20  f the do-loop.  
325c0 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20          ** will 
325d0 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
325e0 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65  nt page to corre
325f0 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20  ct this..       
32600 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20     ** .         
32610 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e   ** If the paren
32620 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
32630 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65  verfull, the ove
32640 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65  rflow cell or ce
32650 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  lls.          **
32660 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
32670 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
32680 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64   allocated immed
32690 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20  iately below. . 
326a0 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75           ** A su
326b0 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
326c0 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
326d0 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68  p will deal with
326e0 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20   this by.       
326f0 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61     ** calling ba
32700 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
32710 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28  (balance_deeper(
32720 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  ) may be called 
32730 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20  first,.         
32740 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e   ** but it doesn
32750 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65  't deal with ove
32760 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75  rflow cells - ju
32770 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f  st moves them to
32780 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
32790 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e  different page).
327a0 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73 65   Once this subse
327b0 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61  quent call to ba
327c0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
327d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
327e0 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20  s completed, it 
327f0 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61  is safe to relea
32800 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  se the pSpace bu
32810 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20 20  ffer used by.   
32820 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72         ** the pr
32830 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20  evious call, as 
32840 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
32850 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65  l data will have
32860 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20   been .         
32870 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65   ** copied eithe
32880 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  r into the body 
32890 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
328a0 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e  ge or into the n
328b0 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ew.          ** 
328c0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70 61  pSpace buffer pa
328d0 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74  ssed to the latt
328e0 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  er call to balan
328f0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20  ce_nonroot()..  
32900 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32910 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20       u8 *pSpace 
32920 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
32930 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70  loc(pCur->pBt->p
32940 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
32950 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
32960 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74  _nonroot(pParent
32970 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20  , iIdx, pSpace, 
32980 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20  iPage==1);.     
32990 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29       if( pFree )
329a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
329b0 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74   If pFree is not
329c0 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73   NULL, it points
329d0 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62   to the pSpace b
329e0 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20  uffer used .    
329f0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20          ** by a 
32a00 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
32a10 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
32a20 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73  (). Its contents
32a30 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20   are.           
32a40 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65   ** now stored e
32a50 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61  ither on real da
32a60 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20  tabase pages or 
32a70 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20  within the .    
32a80 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70          ** new p
32a90 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f  Space buffer, so
32aa0 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c   it may be safel
32ab0 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f  y freed here. */
32ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
32ad0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72  ite3PageFree(pFr
32ae0 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
32af0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
32b00 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
32b10 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
32b20 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61  fter the next ca
32b30 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ll to.          
32b40 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ** balance_nonro
32b50 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65  ot(), or just be
32b60 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
32b70 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63  on returns, whic
32b80 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20  hever.          
32b90 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20  ** comes first. 
32ba0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  */.          pFr
32bb0 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20  ee = pSpace;.   
32bc0 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28         VVA_ONLY(
32bd0 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66   pCur->pagesShuf
32be0 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 20 20  fled = 1 );.    
32bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
32c00 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
32c10 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20  rflow = 0;..    
32c20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74    /* The next it
32c30 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
32c40 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20  o-loop balances 
32c50 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
32c60 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
32c70 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
32c80 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d      pCur->iPage-
32c90 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  -;.    }.  }whil
32ca0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
32cb0 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65   );..  if( pFree
32cc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
32cd0 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a  ageFree(pFree);.
32ce0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
32cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
32d00 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c  outine checks al
32d10 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70  l cursors that p
32d20 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67  oint to table pg
32d30 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e  noRoot..** If an
32d40 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f  y of those curso
32d50 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77  rs were opened w
32d60 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e  ith wrFlag==0 in
32d70 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
32d80 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
32d90 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20  ion (a database 
32da0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
32db0 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72  shares the pager
32dc0 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74  .** cache with t
32dd0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65  he current conne
32de0 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20  ction) and that 
32df0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
32e00 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74   .** is not in t
32e10 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74  he ReadUncommmit
32e20 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20  ted state, then 
32e30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
32e40 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
32e50 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73  LOCKED..**.** As
32e60 20 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73   well as cursors
32e70 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c   with wrFlag==0,
32e80 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 0a 2a   cursors with .*
32e90 2a 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  * isIncrblobHand
32ea0 6c 65 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20 63  le==1 are also c
32eb0 6f 6e 73 69 64 65 72 65 64 20 27 72 65 61 64 27  onsidered 'read'
32ec0 20 63 75 72 73 6f 72 73 20 62 65 63 61 75 73 65   cursors because
32ed0 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  .** incremental 
32ee0 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 61 72 65  blob cursors are
32ef0 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 72   used for both r
32f00 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69  eading and writi
32f10 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  ng..**.** When p
32f20 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 72  gnoRoot is the r
32f30 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 6e 20 69  oot page of an i
32f40 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 69  ntkey table, thi
32f50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c  s function is al
32f60 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c  so.** responsibl
32f70 65 20 66 6f 72 20 69 6e 76 61 6c 69 64 61 74 69  e for invalidati
32f80 6e 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  ng incremental b
32f90 6c 6f 62 20 63 75 72 73 6f 72 73 20 77 68 65 6e  lob cursors when
32fa0 20 74 68 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a   the table row.*
32fb0 2a 20 6f 6e 20 77 68 69 63 68 20 74 68 65 79 20  * on which they 
32fc0 61 72 65 20 6f 70 65 6e 65 64 20 69 73 20 64 65  are opened is de
32fd0 6c 65 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65  leted or modifie
32fe0 64 2e 20 43 75 72 73 6f 72 73 20 61 72 65 20 69  d. Cursors are i
32ff0 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63  nvalidated.** ac
33000 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66  cording to the f
33010 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a  ollowing rules:.
33020 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20  **.**   1) When 
33030 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
33040 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  ) is called to c
33050 6f 6d 70 6c 65 74 65 6c 79 20 64 65 6c 65 74 65  ompletely delete
33060 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
33070 20 20 20 20 20 20 6f 66 20 61 20 42 2d 54 72 65        of a B-Tre
33080 65 20 74 61 62 6c 65 2c 20 70 45 78 63 6c 75 64  e table, pExclud
33090 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
330a0 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69   and parameter i
330b0 52 6f 77 20 69 73 20 0a 2a 2a 20 20 20 20 20 20  Row is .**      
330c0 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e  set to non-zero.
330d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
330e0 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  l incremental bl
330f0 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a  ob cursors open.
33100 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 74  **      on the t
33110 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
33120 67 6e 6f 52 6f 6f 74 20 61 72 65 20 69 6e 76 61  gnoRoot are inva
33130 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  lidated..**.**  
33140 20 32 29 20 57 68 65 6e 20 42 74 72 65 65 49 6e   2) When BtreeIn
33150 73 65 72 74 28 29 2c 20 42 74 72 65 65 44 65 6c  sert(), BtreeDel
33160 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 50 75  ete() or BtreePu
33170 74 44 61 74 61 28 29 20 69 73 20 63 61 6c 6c 65  tData() is calle
33180 64 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f  d to .**      mo
33190 64 69 66 79 20 61 20 74 61 62 6c 65 20 72 6f 77  dify a table row
331a0 20 76 69 61 20 61 6e 20 53 51 4c 20 73 74 61 74   via an SQL stat
331b0 65 6d 65 6e 74 2c 20 70 45 78 63 6c 75 64 65 20  ement, pExclude 
331c0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
331d0 2a 20 20 20 20 20 20 77 72 69 74 65 20 63 75 72  *      write cur
331e0 73 6f 72 20 75 73 65 64 20 74 6f 20 64 6f 20 74  sor used to do t
331f0 68 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  he modification 
33200 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52  and parameter iR
33210 6f 77 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20  ow is set.**    
33220 20 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72    to the integer
33230 20 72 6f 77 20 69 64 20 6f 66 20 74 68 65 20 42   row id of the B
33240 2d 54 72 65 65 20 65 6e 74 72 79 20 62 65 69 6e  -Tree entry bein
33250 67 20 6d 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65  g modified. Unle
33260 73 73 0a 2a 2a 20 20 20 20 20 20 70 45 78 63 6c  ss.**      pExcl
33270 75 64 65 20 69 73 20 69 74 73 65 6c 66 20 61 6e  ude is itself an
33280 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
33290 62 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 61  b cursor, then a
332a0 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a  ll incremental.*
332b0 2a 20 20 20 20 20 20 62 6c 6f 62 20 63 75 72 73  *      blob curs
332c0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20  ors open on row 
332d0 69 52 6f 77 20 6f 66 20 74 68 65 20 42 2d 54 72  iRow of the B-Tr
332e0 65 65 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  ee are invalidat
332f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49  ed..**.**   3) I
33300 66 20 62 6f 74 68 20 70 45 78 63 6c 75 64 65 20  f both pExclude 
33310 61 6e 64 20 69 52 6f 77 20 61 72 65 20 73 65 74  and iRow are set
33320 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63   to zero, no inc
33330 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a  remental blob .*
33340 2a 20 20 20 20 20 20 63 75 72 73 6f 72 73 20 61  *      cursors a
33350 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  re invalidated..
33360 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
33370 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69  eckForReadConfli
33380 63 74 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  cts(.  Btree *pB
33390 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
333a0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
333b0 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
333c0 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
333d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
333e0 6b 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  k for read curso
333f0 72 73 20 6f 6e 20 74 68 69 73 20 62 74 72 65 65  rs on this btree
33400 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
33410 70 45 78 63 6c 75 64 65 2c 20 20 20 20 20 2f 2a  pExclude,     /*
33420 20 49 67 6e 6f 72 65 20 74 68 69 73 20 63 75 72   Ignore this cur
33430 73 6f 72 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  sor */.  i64 iRo
33440 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
33450 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
33460 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
33470 67 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  ging */.){.  BtC
33480 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
33490 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
334a0 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74  ee->pBt;.  sqlit
334b0 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d  e3 *db = pBtree-
334c0 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
334d0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
334e0 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b  Mutex(pBtree) );
334f0 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
33500 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
33510 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
33520 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e  ==pExclude ) con
33530 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
33540 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f  ->pgnoRoot!=pgno
33550 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Root ) continue;
33560 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33570 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
33580 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72 62    if( p->isIncrb
33590 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 20 0a  lobHandle && ( .
335a0 20 20 20 20 20 20 20 20 20 28 21 70 45 78 63 6c           (!pExcl
335b0 75 64 65 20 26 26 20 69 52 6f 77 29 0a 20 20 20  ude && iRow).   
335c0 20 20 20 7c 7c 20 28 70 45 78 63 6c 75 64 65 20     || (pExclude 
335d0 26 26 20 21 70 45 78 63 6c 75 64 65 2d 3e 69 73  && !pExclude->is
335e0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
335f0 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  & p->info.nKey==
33600 69 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20 20  iRow).    )){.  
33610 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
33620 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
33630 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
33640 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d   if( p->eState!=
33650 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63  CURSOR_VALID ) c
33660 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
33670 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23   p->wrFlag==0 .#
33680 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33690 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
336a0 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f   || p->isIncrblo
336b0 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20  bHandle.#endif. 
336c0 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
336d0 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70  te3 *dbOther = p
336e0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
336f0 20 20 20 20 61 73 73 65 72 74 28 64 62 4f 74 68      assert(dbOth
33700 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  er);.      if( d
33710 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64  bOther!=db && (d
33720 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20  bOther->flags & 
33730 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
33740 6d 69 74 74 65 64 29 3d 3d 30 20 29 7b 0a 20 20  mitted)==0 ){.  
33750 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
33760 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 64  nectionBlocked(d
33770 62 2c 20 64 62 4f 74 68 65 72 29 3b 0a 20 20 20  b, dbOther);.   
33780 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33790 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
337a0 43 41 43 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20  CACHE;.      }. 
337b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
337c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
337d0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
337e0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
337f0 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b  he BTree.  The k
33800 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ey is given by (
33810 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e  pKey,nKey).** an
33820 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69  d the data is gi
33830 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44  ven by (pData,nD
33840 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f  ata).  The curso
33850 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  r is used only t
33860 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74  o.** define what
33870 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72   table the recor
33880 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  d should be inse
33890 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20  rted into.  The 
338a0 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
338b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
338c0 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e  random location.
338d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e  .**.** For an IN
338e0 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79  TKEY table, only
338f0 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20   the nKey value 
33900 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73  of the key is us
33910 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20  ed.  pKey is.** 
33920 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20  ignored.  For a 
33930 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20  ZERODATA table, 
33940 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44  the pData and nD
33950 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e  ata are both ign
33960 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
33970 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61  he seekResult pa
33980 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
33990 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 75 63 63  ero, then a succ
339a0 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a  essful call to.*
339b0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  * sqlite3BtreeMo
339c0 76 65 74 6f 28 29 20 74 6f 20 73 65 65 6b 20 63  veto() to seek c
339d0 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70  ursor pCur to (p
339e0 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61  Key, nKey) has a
339f0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
33a00 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65  erformed. seekRe
33a10 73 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72  sult is the sear
33a20 63 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e  ch result return
33a30 65 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a  ed (a negative.*
33a40 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72  * number if pCur
33a50 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e   points at an en
33a60 74 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c  try that is smal
33a70 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20  ler than (pKey, 
33a80 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70  nKey), or.** a p
33a90 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
33aa0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
33ab0 61 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20  an etry that is 
33ac0 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20  larger than .** 
33ad0 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a  (pKey, nKey)). .
33ae0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65  **.** If the see
33af0 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65  kResult paramete
33b00 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72  r is 0, then cur
33b10 73 6f 72 20 70 43 75 72 20 6d 61 79 20 70 6f 69  sor pCur may poi
33b20 6e 74 20 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e  nt to any .** en
33b30 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74  try or to no ent
33b40 72 79 20 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68  ry at all. In th
33b50 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e  is case this fun
33b60 63 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65  ction has to see
33b70 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  k.** the cursor 
33b80 62 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b  before the new k
33b90 65 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74  ey can be insert
33ba0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
33bb0 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20  e3BtreeInsert(. 
33bc0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
33bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33be0 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
33bf0 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66  nto the table of
33c00 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
33c10 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
33c20 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
33c30 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74   /* The key of t
33c40 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
33c50 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
33c60 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c  Data, int nData,
33c70 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66    /* The data of
33c80 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
33c90 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
33ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33cb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33cc0 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74   extra 0 bytes t
33cd0 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61  o append to data
33ce0 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64   */.  int append
33cf0 42 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  Bias,           
33d00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
33d10 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61  this is likely a
33d20 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e  n append */.  in
33d30 74 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20  t seekResult    
33d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33d50 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20  Result of prior 
33d60 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
33d70 74 6f 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a  to() call */.){.
33d80 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
33d90 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74  loc = seekResult
33da0 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20  ;.  int szNew;. 
33db0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
33dc0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
33dd0 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
33de0 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
33df0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
33e00 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
33e10 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
33e20 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
33e30 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ell = 0;..  asse
33e40 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
33e50 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
33e60 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
33e70 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
33e80 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
33e90 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
33ea0 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nly );.  assert(
33eb0 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b   pCur->wrFlag );
33ec0 0a 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72  .  rc = checkFor
33ed0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 43  ReadConflicts(pC
33ee0 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72  ur->pBtree, pCur
33ef0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
33f00 2c 20 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20 72  , nKey);.  if( r
33f10 63 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  c ){            
33f20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62   .    /* The tab
33f30 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
33f40 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
33f50 6b 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  k */.    assert(
33f60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b   rc==SQLITE_LOCK
33f70 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  ED_SHAREDCACHE )
33f80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
33f90 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
33fa0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
33fb0 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
33fc0 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
33fd0 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74    }..  /* Save t
33fe0 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
33ff0 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
34000 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
34010 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
34020 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
34030 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
34040 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20  e3BtreeMoveto() 
34050 62 65 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70  below is a no-op
34060 2e 20 46 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70  . For.  ** examp
34070 6c 65 2c 20 77 68 65 6e 20 69 6e 73 65 72 74 69  le, when inserti
34080 6e 67 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74  ng data into a t
34090 61 62 6c 65 20 77 69 74 68 20 61 75 74 6f 2d 67  able with auto-g
340a0 65 6e 65 72 61 74 65 64 20 69 6e 74 65 67 65 72  enerated integer
340b0 0a 20 20 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20  .  ** keys, the 
340c0 56 44 42 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b  VDBE layer invok
340d0 65 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  es sqlite3BtreeL
340e0 61 73 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  ast() to figure 
340f0 6f 75 74 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e  out the .  ** in
34100 74 65 67 65 72 20 6b 65 79 20 74 6f 20 75 73 65  teger key to use
34110 2e 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20  . It then calls 
34120 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
34130 20 61 63 74 75 61 6c 6c 79 20 69 6e 73 65 72 74   actually insert
34140 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 20   the .  ** data 
34150 69 6e 74 6f 20 74 68 65 20 69 6e 74 6b 65 79 20  into the intkey 
34160 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
34170 63 61 73 65 20 73 71 6c 69 74 65 33 42 74 72 65  case sqlite3Btre
34180 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67 6e  eMoveto() recogn
34190 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 74  izes.  ** that t
341a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
341b0 65 61 64 79 20 77 68 65 72 65 20 69 74 20 6e 65  eady where it ne
341c0 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72 65  eds to be and re
341d0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20 20  turns without.  
341e0 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ** doing any wor
341f0 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77 61  k. To avoid thwa
34200 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74 69  rting these opti
34210 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69 73  mizations, it is
34220 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20   important.  ** 
34230 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68 65  not to clear the
34240 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20 20   cursor here..  
34250 2a 2f 0a 20 20 69 66 28 0a 20 20 20 20 53 51 4c  */.  if(.    SQL
34260 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
34270 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
34280 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
34290 2c 20 70 43 75 72 29 29 20 7c 7c 20 28 21 6c 6f  , pCur)) || (!lo
342a0 63 20 26 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  c &&.    SQLITE_
342b0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
342c0 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75  3BtreeMoveto(pCu
342d0 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61  r, pKey, nKey, a
342e0 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29  ppendBias, &loc)
342f0 29 0a 20 20 29 29 7b 0a 20 20 20 20 72 65 74 75  ).  )){.    retu
34300 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
34310 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
34320 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
34330 7c 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65  || (pCur->eState
34340 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
34350 20 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70   && loc) );..  p
34360 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
34370 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
34380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34390 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65  e->intKey || nKe
343a0 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
343b0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c  ( pPage->leaf ||
343c0 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
343d0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53  );.  TRACE(("INS
343e0 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b  ERT: table=%d nk
343f0 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64  ey=%lld ndata=%d
34400 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   page=%d %s\n",.
34410 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
34420 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20  pgnoRoot, nKey, 
34430 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67  nData, pPage->pg
34440 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f  no,.          lo
34450 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74  c==0 ? "overwrit
34460 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22  e" : "new entry"
34470 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
34480 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
34490 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
344a0 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65  ce(pBt);.  newCe
344b0 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  ll = pBt->pTmpSp
344c0 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65  ace;.  if( newCe
344d0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
344e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
344f0 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70  c = fillInCell(p
34500 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70  Page, newCell, p
34510 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61  Key, nKey, pData
34520 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20  , nData, nZero, 
34530 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72  &szNew);.  if( r
34540 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
34550 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ert;.  assert( s
34560 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  zNew==cellSizePt
34570 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  r(pPage, newCell
34580 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
34590 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49  zNew<=MX_CELL_SI
345a0 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78  ZE(pBt) );.  idx
345b0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
345c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
345d0 66 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20  f( loc==0 ){.   
345e0 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20   u16 szOld;.    
345f0 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 67  assert( idx<pPag
34600 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
34610 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34620 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
34630 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
34640 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
34650 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
34660 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d   }.    oldCell =
34670 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
34680 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21   idx);.    if( !
34690 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
346a0 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43       memcpy(newC
346b0 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29  ell, oldCell, 4)
346c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c  ;.    }.    szOl
346d0 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  d = cellSizePtr(
346e0 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
346f0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
34700 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  ell(pPage, oldCe
34710 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ll);.    if( rc 
34720 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
34730 74 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70  t;.    rc = drop
34740 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
34750 20 73 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28   szOld);.    if(
34760 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34770 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   {.      goto en
34780 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a  d_insert;.    }.
34790 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c    }else if( loc<
347a0 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0 && pPage->nCel
347b0 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  l>0 ){.    asser
347c0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
347d0 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43  ;.    idx = ++pC
347e0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
347f0 69 50 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b  iPage];.  }else{
34800 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
34810 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a  ge->leaf );.  }.
34820 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
34830 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65  l(pPage, idx, ne
34840 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c  wCell, szNew, 0,
34850 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
34860 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
34870 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
34880 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  | pPage->nOverfl
34890 6f 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ow>0 );..  /* If
348a0 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63   no error has oc
348b0 63 75 72 65 64 20 61 6e 64 20 70 50 61 67 65 20  cured and pPage 
348c0 68 61 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  has an overflow 
348d0 63 65 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  cell, call balan
348e0 63 65 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65  ce() .  ** to re
348f0 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 63  distribute the c
34900 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20  ells within the 
34910 74 72 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61  tree. Since bala
34920 6e 63 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20  nce() may move. 
34930 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20   ** the cursor, 
34940 7a 65 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f  zero the BtCurso
34950 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64  r.info.nSize and
34960 20 42 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e   BtCursor.validN
34970 4b 65 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  Key.  ** variabl
34980 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72  es..  **.  ** Pr
34990 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
349a0 6f 66 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64  of SQLite called
349b0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f   moveToRoot() to
349c0 20 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   move the cursor
349d0 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68  .  ** back to th
349e0 65 20 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62  e root page as b
349f0 61 6c 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f  alance() used to
34a00 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
34a10 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  contents.  ** of
34a20 20 42 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65   BtCursor.apPage
34a30 5b 5d 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  [] and BtCursor.
34a40 61 69 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64  aiIdx[]. Instead
34a50 20 6f 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a   of doing that,.
34a60 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72    ** set the cur
34a70 73 6f 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e  sor state to "in
34a80 76 61 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b  valid". This mak
34a90 65 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74  es common insert
34aa0 20 6f 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a   operations.  **
34ab0 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
34ac0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72  ..  **.  ** Ther
34ad0 65 20 69 73 20 61 20 73 75 62 74 6c 65 20 62 75  e is a subtle bu
34ae0 74 20 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69  t important opti
34af0 6d 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f  mization here to
34b00 6f 2e 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e  o. When insertin
34b10 67 0a 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20  g.  ** multiple 
34b20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20  records into an 
34b30 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73  intkey b-tree us
34b40 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72  ing a single cur
34b50 73 6f 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a  sor (as can.  **
34b60 20 68 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72   happen while pr
34b70 6f 63 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53  ocessing an "INS
34b80 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c  ERT INTO ... SEL
34b90 45 43 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c  ECT" statement),
34ba0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61   it.  ** is adva
34bb0 6e 74 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76  ntageous to leav
34bc0 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  e the cursor poi
34bd0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
34be0 74 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20  t entry in.  ** 
34bf0 74 68 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f  the b-tree if po
34c00 73 73 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63  ssible. If the c
34c10 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
34c20 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
34c30 73 74 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e  st.  ** entry in
34c40 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20   the table, and 
34c50 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73  the next row ins
34c60 65 72 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74  erted has an int
34c70 65 67 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61  eger key.  ** la
34c80 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
34c90 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b  rgest existing k
34ca0 65 79 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  ey, it is possib
34cb0 6c 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  le to insert the
34cc0 0a 20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75  .  ** row withou
34cd0 74 20 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75  t seeking the cu
34ce0 72 73 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62  rsor. This can b
34cf0 65 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61  e a big performa
34d00 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a  nce boost..  */.
34d10 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
34d20 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
34d30 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
34d40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34d50 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76  OK && pPage->nOv
34d60 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63  erflow ){.    rc
34d70 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29   = balance(pCur)
34d80 3b 0a 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d  ;..    /* Must m
34d90 61 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c  ake sure nOverfl
34da0 6f 77 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a  ow is reset to z
34db0 65 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20  ero even if the 
34dc0 62 61 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a  balance().    **
34dd0 20 66 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c   fails. Internal
34de0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
34df0 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20  corruption will 
34e00 72 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65  result otherwise
34e10 2e 20 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  . .    ** Also, 
34e20 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73  set the cursor s
34e30 74 61 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e  tate to invalid.
34e40 20 54 68 69 73 20 73 74 6f 70 73 20 73 61 76 65   This stops save
34e50 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
34e60 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79  .    ** from try
34e70 69 6e 67 20 74 6f 20 73 61 76 65 20 74 68 65 20  ing to save the 
34e80 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
34e90 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
34ea0 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70   */.    pCur->ap
34eb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
34ec0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  ]->nOverflow = 0
34ed0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
34ee0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
34ef0 4c 49 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  LID;.  }.  asser
34f00 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
34f10 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f  pCur->iPage]->nO
34f20 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65  verflow==0 );..e
34f30 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74  nd_insert:.  ret
34f40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
34f50 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72   Delete the entr
34f60 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
34f70 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
34f80 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
34f90 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
34fa0 67 20 61 74 20 61 20 61 72 62 69 74 72 61 72 79  g at a arbitrary
34fb0 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   location..*/.in
34fc0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  t sqlite3BtreeDe
34fd0 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70  lete(BtCursor *p
34fe0 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
34ff0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
35000 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
35010 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
35020 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72          .  int r
35030 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
35040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35050 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
35060 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
35070 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
35080 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
35090 20 74 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20   to delete cell 
350a0 66 72 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  from */.  unsign
350b0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20  ed char *pCell; 
350c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
350d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c  * Pointer to cel
350e0 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  l to delete */. 
350f0 20 69 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20   int iCellIdx;  
35100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35110 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
35120 66 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65  f cell to delete
35130 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44   */.  int iCellD
35140 65 70 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  epth;           
35150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
35160 70 74 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74  pth of node cont
35170 61 69 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20  aining pCell */ 
35180 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
35190 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
351a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
351b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
351c0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
351d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  );.  assert( !pB
351e0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
351f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77   assert( pCur->w
35200 72 46 6c 61 67 20 29 3b 0a 20 20 69 66 28 20 4e  rFlag );.  if( N
35210 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78  EVER(pCur->aiIdx
35220 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
35230 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
35240 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29  ->iPage]->nCell)
35250 20 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43   .   || NEVER(pC
35260 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
35270 4f 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20  OR_VALID).  ){. 
35280 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35290 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65  _ERROR;  /* Some
352a0 74 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61  thing has gone a
352b0 77 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72  wry. */.  }..  r
352c0 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64  c = checkForRead
352d0 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75  Conflicts(p, pCu
352e0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
352f0 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  r, pCur->info.nK
35300 65 79 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ey);.  if( rc!=S
35310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35320 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
35330 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
35340 43 41 43 48 45 20 29 3b 0a 20 20 20 20 72 65 74  CACHE );.    ret
35350 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 20  urn rc;         
35360 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
35370 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
35380 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
35390 2f 0a 20 20 7d 0a 0a 20 20 69 43 65 6c 6c 44 65  /.  }..  iCellDe
353a0 70 74 68 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  pth = pCur->iPag
353b0 65 3b 0a 20 20 69 43 65 6c 6c 49 64 78 20 3d 20  e;.  iCellIdx = 
353c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 43 65 6c  pCur->aiIdx[iCel
353d0 6c 44 65 70 74 68 5d 3b 0a 20 20 70 50 61 67 65  lDepth];.  pPage
353e0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
353f0 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20 20 70  iCellDepth];.  p
35400 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
35410 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 29  pPage, iCellIdx)
35420 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
35430 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
35440 68 65 20 65 6e 74 72 79 20 74 6f 20 64 65 6c 65  he entry to dele
35450 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  te is not a leaf
35460 20 70 61 67 65 2c 20 6d 6f 76 65 0a 20 20 2a 2a   page, move.  **
35470 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
35480 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79  he largest entry
35490 20 69 6e 20 74 68 65 20 74 72 65 65 20 74 68 61   in the tree tha
354a0 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
354b0 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79  n.  ** the entry
354c0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20   being deleted. 
354d0 54 68 69 73 20 63 65 6c 6c 20 77 69 6c 6c 20 72  This cell will r
354e0 65 70 6c 61 63 65 20 74 68 65 20 63 65 6c 6c 20  eplace the cell 
354f0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 0a 20 20  being deleted.  
35500 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ** from the inte
35510 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 65 20 27  rnal node. The '
35520 70 72 65 76 69 6f 75 73 27 20 65 6e 74 72 79 20  previous' entry 
35530 69 73 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  is used for this
35540 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6f 66   instead.  ** of
35550 20 74 68 65 20 27 6e 65 78 74 27 20 65 6e 74 72   the 'next' entr
35560 79 2c 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  y, as the previo
35570 75 73 20 65 6e 74 72 79 20 69 73 20 61 6c 77 61  us entry is alwa
35580 79 73 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  ys a part of the
35590 0a 20 20 2a 2a 20 73 75 62 2d 74 72 65 65 20 68  .  ** sub-tree h
355a0 65 61 64 65 64 20 62 79 20 74 68 65 20 63 68 69  eaded by the chi
355b0 6c 64 20 70 61 67 65 20 6f 66 20 74 68 65 20 63  ld page of the c
355c0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
355d0 64 2e 20 54 68 69 73 20 6d 61 6b 65 73 0a 20 20  d. This makes.  
355e0 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  ** balancing the
355f0 20 74 72 65 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   tree following 
35600 74 68 65 20 64 65 6c 65 74 65 20 6f 70 65 72 61  the delete opera
35610 74 69 6f 6e 20 65 61 73 69 65 72 2e 20 20 2a 2f  tion easier.  */
35620 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
35630 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  eaf ){.    int n
35640 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 66 28 20  otUsed;.    if( 
35650 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
35660 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
35670 76 69 6f 75 73 28 70 43 75 72 2c 20 26 6e 6f 74  vious(pCur, &not
35680 55 73 65 64 29 29 20 29 7b 0a 20 20 20 20 20 20  Used)) ){.      
35690 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
356a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20  .  }..  /* Save 
356b0 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
356c0 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
356d0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
356e0 74 61 62 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a  table before.  *
356f0 2a 20 6d 61 6b 69 6e 67 20 61 6e 79 20 6d 6f 64  * making any mod
35700 69 66 69 63 61 74 69 6f 6e 73 2e 20 4d 61 6b 65  ifications. Make
35710 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
35720 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74  ning the entry t
35730 6f 20 62 65 20 0a 20 20 2a 2a 20 64 65 6c 65 74  o be .  ** delet
35740 65 64 20 77 72 69 74 61 62 6c 65 2e 20 54 68 65  ed writable. The
35750 6e 20 66 72 65 65 20 61 6e 79 20 6f 76 65 72 66  n free any overf
35760 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
35770 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 20  ated with the . 
35780 20 2a 2a 20 65 6e 74 72 79 20 61 6e 64 20 66 69   ** entry and fi
35790 6e 61 6c 6c 79 20 72 65 6d 6f 76 65 20 74 68 65  nally remove the
357a0 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 66 72 6f   cell itself fro
357b0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  m within the pag
357c0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  e.  */.  if( SQL
357d0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
357e0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
357f0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
35800 2c 20 70 43 75 72 29 29 0a 20 20 20 7c 7c 20 53  , pCur)).   || S
35810 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
35820 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35830 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
35840 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
35850 4f 4b 21 3d 28 72 63 20 3d 20 63 6c 65 61 72 43  OK!=(rc = clearC
35860 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
35870 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
35880 4f 4b 21 3d 28 72 63 20 3d 20 64 72 6f 70 43 65  OK!=(rc = dropCe
35890 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49  ll(pPage, iCellI
358a0 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
358b0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 29 0a  pPage, pCell))).
358c0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
358d0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rc;.  }..  /* If
358e0 20 74 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65   the cell delete
358f0 64 20 77 61 73 20 6e 6f 74 20 6c 6f 63 61 74 65  d was not locate
35900 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61 67 65  d on a leaf page
35910 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
35920 72 0a 20 20 2a 2a 20 69 73 20 63 75 72 72 65 6e  r.  ** is curren
35930 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
35940 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72  the largest entr
35950 79 20 69 6e 20 74 68 65 20 73 75 62 2d 74 72 65  y in the sub-tre
35960 65 20 68 65 61 64 65 64 0a 20 20 2a 2a 20 62 79  e headed.  ** by
35970 20 74 68 65 20 63 68 69 6c 64 2d 70 61 67 65 20   the child-page 
35980 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
35990 20 77 61 73 20 6a 75 73 74 20 64 65 6c 65 74 65   was just delete
359a0 64 20 66 72 6f 6d 20 61 6e 20 69 6e 74 65 72 6e  d from an intern
359b0 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 2e 20 54 68  al.  ** node. Th
359c0 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20  e cell from the 
359d0 6c 65 61 66 20 6e 6f 64 65 20 6e 65 65 64 73 20  leaf node needs 
359e0 74 6f 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74  to be moved to t
359f0 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a  he internal.  **
35a00 20 6e 6f 64 65 20 74 6f 20 72 65 70 6c 61 63 65   node to replace
35a10 20 74 68 65 20 64 65 6c 65 74 65 64 20 63 65 6c   the deleted cel
35a20 6c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  l.  */.  if( !pP
35a30 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
35a40 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 20   MemPage *pLeaf 
35a50 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
35a60 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
35a70 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20   int nCell;.    
35a80 50 67 6e 6f 20 6e 20 3d 20 70 43 75 72 2d 3e 61  Pgno n = pCur->a
35a90 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74 68  pPage[iCellDepth
35aa0 2b 31 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75  +1]->pgno;.    u
35ab0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 54  nsigned char *pT
35ac0 6d 70 3b 0a 0a 20 20 20 20 70 43 65 6c 6c 20 3d  mp;..    pCell =
35ad0 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 2c   findCell(pLeaf,
35ae0 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29   pLeaf->nCell-1)
35af0 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 63 65  ;.    nCell = ce
35b00 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65 61 66 2c  llSizePtr(pLeaf,
35b10 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73   pCell);.    ass
35b20 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  ert( MX_CELL_SIZ
35b30 45 28 70 42 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b  E(pBt)>=nCell );
35b40 0a 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65  ..    allocateTe
35b50 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
35b60 20 20 70 54 6d 70 20 3d 20 70 42 74 2d 3e 70 54    pTmp = pBt->pT
35b70 6d 70 53 70 61 63 65 3b 0a 0a 20 20 20 20 69 66  mpSpace;..    if
35b80 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
35b90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35ba0 72 69 74 65 28 70 4c 65 61 66 2d 3e 70 44 62 50  rite(pLeaf->pDbP
35bb0 61 67 65 29 29 20 0a 20 20 20 20 20 7c 7c 20 53  age)) .     || S
35bc0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
35bd0 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
35be0 2c 20 69 43 65 6c 6c 49 64 78 2c 20 70 43 65 6c  , iCellIdx, pCel
35bf0 6c 2d 34 2c 20 6e 43 65 6c 6c 2b 34 2c 20 70 54  l-4, nCell+4, pT
35c00 6d 70 2c 20 6e 29 29 0a 20 20 20 20 20 7c 7c 20  mp, n)).     || 
35c10 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
35c20 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 2c   dropCell(pLeaf,
35c30 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 2c   pLeaf->nCell-1,
35c40 20 6e 43 65 6c 6c 29 29 0a 20 20 20 20 29 7b 0a   nCell)).    ){.
35c50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
35c70 20 42 61 6c 61 6e 63 65 20 74 68 65 20 74 72 65   Balance the tre
35c80 65 2e 20 49 66 20 74 68 65 20 65 6e 74 72 79 20  e. If the entry 
35c90 64 65 6c 65 74 65 64 20 77 61 73 20 6c 6f 63 61  deleted was loca
35ca0 74 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61  ted on a leaf pa
35cb0 67 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  ge,.  ** then th
35cc0 65 20 63 75 72 73 6f 72 20 73 74 69 6c 6c 20 70  e cursor still p
35cd0 6f 69 6e 74 73 20 74 6f 20 74 68 61 74 20 70 61  oints to that pa
35ce0 67 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ge. In this case
35cf0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
35d00 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28  call to balance(
35d10 29 20 72 65 70 61 69 72 73 20 74 68 65 20 74 72  ) repairs the tr
35d20 65 65 2c 20 61 6e 64 20 74 68 65 20 69 66 28 2e  ee, and the if(.
35d30 2e 2e 29 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  ..) condition is
35d40 0a 20 20 2a 2a 20 6e 65 76 65 72 20 74 72 75 65  .  ** never true
35d50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65  ..  **.  ** Othe
35d60 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 65 6e  rwise, if the en
35d70 74 72 79 20 64 65 6c 65 74 65 64 20 77 61 73 20  try deleted was 
35d80 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  on an internal n
35d90 6f 64 65 20 70 61 67 65 2c 20 74 68 65 6e 0a 20  ode page, then. 
35da0 20 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e   ** pCur is poin
35db0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 65 61 66  ting to the leaf
35dc0 20 70 61 67 65 20 66 72 6f 6d 20 77 68 69 63 68   page from which
35dd0 20 61 20 63 65 6c 6c 20 77 61 73 20 72 65 6d 6f   a cell was remo
35de0 76 65 64 20 74 6f 0a 20 20 2a 2a 20 72 65 70 6c  ved to.  ** repl
35df0 61 63 65 20 74 68 65 20 63 65 6c 6c 20 64 65 6c  ace the cell del
35e00 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  eted from the in
35e10 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 69  ternal node. Thi
35e20 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20  s is slightly.  
35e30 2a 2a 20 74 72 69 63 6b 79 20 61 73 20 74 68 65  ** tricky as the
35e40 20 6c 65 61 66 20 6e 6f 64 65 20 6d 61 79 20 62   leaf node may b
35e50 65 20 75 6e 64 65 72 66 75 6c 6c 2c 20 61 6e 64  e underfull, and
35e60 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
35e70 64 65 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 65  de may.  ** be e
35e80 69 74 68 65 72 20 75 6e 64 65 72 20 6f 72 20 6f  ither under or o
35e90 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73  verfull. In this
35ea0 20 63 61 73 65 20 72 75 6e 20 74 68 65 20 62 61   case run the ba
35eb0 6c 61 6e 63 69 6e 67 20 61 6c 67 6f 72 69 74 68  lancing algorith
35ec0 6d 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  m.  ** on the le
35ed0 61 66 20 6e 6f 64 65 20 66 69 72 73 74 2e 20 49  af node first. I
35ee0 66 20 74 68 65 20 62 61 6c 61 6e 63 65 20 70 72  f the balance pr
35ef0 6f 63 65 65 64 73 20 66 61 72 20 65 6e 6f 75 67  oceeds far enoug
35f00 68 20 75 70 20 74 68 65 0a 20 20 2a 2a 20 74 72  h up the.  ** tr
35f10 65 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 62  ee that we can b
35f20 65 20 73 75 72 65 20 74 68 61 74 20 61 6e 79 20  e sure that any 
35f30 70 72 6f 62 6c 65 6d 20 69 6e 20 74 68 65 20 69  problem in the i
35f40 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 68 61 73  nternal node has
35f50 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 72 72 65  .  ** been corre
35f60 63 74 65 64 2c 20 73 6f 20 62 65 20 69 74 2e 20  cted, so be it. 
35f70 4f 74 68 65 72 77 69 73 65 2c 20 61 66 74 65 72  Otherwise, after
35f80 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 6c   balancing the l
35f90 65 61 66 20 6e 6f 64 65 2c 0a 20 20 2a 2a 20 77  eaf node,.  ** w
35fa0 61 6c 6b 20 74 68 65 20 63 75 72 73 6f 72 20 75  alk the cursor u
35fb0 70 20 74 68 65 20 74 72 65 65 20 74 6f 20 74 68  p the tree to th
35fc0 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
35fd0 61 6e 64 20 62 61 6c 61 6e 63 65 20 69 74 20 61  and balance it a
35fe0 73 20 0a 20 20 2a 2a 20 77 65 6c 6c 2e 20 20 2a  s .  ** well.  *
35ff0 2f 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  /.  rc = balance
36000 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
36010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
36020 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c  Cur->iPage>iCell
36030 44 65 70 74 68 20 29 7b 0a 20 20 20 20 77 68 69  Depth ){.    whi
36040 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  le( pCur->iPage>
36050 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20 20  iCellDepth ){.  
36060 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
36070 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
36080 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
36090 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 62 61 6c    }.    rc = bal
360a0 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a  ance(pCur);.  }.
360b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
360c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
360d0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
360e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
360f0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
36100 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65   new BTree table
36110 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
36120 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a  iTable the page.
36130 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
36140 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
36150 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a  he new table..**
36160 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20  .** The type of 
36170 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e  type is determin
36180 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20  ed by the flags 
36190 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79  parameter.  Only
361a0 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
361b0 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67  g values of flag
361c0 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
361d0 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76  in use.  Other v
361e0 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61  alues for.** fla
361f0 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72  gs might not wor
36200 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52  k:.**.**     BTR
36210 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f  EE_INTKEY|BTREE_
36220 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65  LEAFDATA     Use
36230 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73  d for SQL tables
36240 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73   with rowid keys
36250 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45  .**     BTREE_ZE
36260 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20  RODATA          
36270 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72          Used for
36280 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a   SQL indices.*/.
36290 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
362a0 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65  CreateTable(Btre
362b0 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62  e *p, int *piTab
362c0 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
362d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
362e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
362f0 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67  age *pRoot;.  Pg
36300 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69  no pgnoRoot;.  i
36310 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
36320 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
36330 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
36340 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
36350 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
36360 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
36370 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
36380 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20  Only );..#ifdef 
36390 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
363a0 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c  VACUUM.  rc = al
363b0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
363c0 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
363d0 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
363e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
363f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
36400 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  lse.  if( pBt->a
36410 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
36420 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20   Pgno pgnoMove; 
36430 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70       /* Move a p
36440 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65  age here to make
36450 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f   room for the ro
36460 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d  ot-page */.    M
36470 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76  emPage *pPageMov
36480 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74  e; /* The page t
36490 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20  o move to. */.. 
364a0 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61     /* Creating a
364b0 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70   new table may p
364c0 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20  robably require 
364d0 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69  moving an existi
364e0 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  ng database.    
364f0 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  ** to make room 
36500 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
36510 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e  es root page. In
36520 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20   case this page 
36530 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74  turns.    ** out
36540 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c   to be an overfl
36550 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20  ow page, delete 
36560 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  all overflow pag
36570 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20  e-map caches.   
36580 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e   ** held by open
36590 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f   cursors..    */
365a0 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
365b0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
365c0 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  pBt);..    /* Re
365d0 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
365e0 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65  meta[3] from the
365f0 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74   database to det
36600 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65  ermine where the
36610 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  .    ** root pag
36620 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
36630 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65  le should go. me
36640 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72  ta[3] is the lar
36650 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
36660 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f     ** created so
36670 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77   far, so the new
36680 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d   root-page is (m
36690 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a  eta[3]+1)..    *
366a0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
366b0 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
366c0 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f  , BTREE_LARGEST_
366d0 52 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67 6e 6f  ROOT_PAGE, &pgno
366e0 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
366f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36700 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36710 0a 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52  .    }.    pgnoR
36720 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54  oot++;..    /* T
36730 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
36740 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f   may not be allo
36750 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74  cated on a point
36760 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20  er-map page, or 
36770 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49  the.    ** PENDI
36780 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20  NG_BYTE page..  
36790 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
367a0 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50  pgnoRoot==PTRMAP
367b0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e  _PAGENO(pBt, pgn
367c0 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20  oRoot) ||.      
367d0 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44    pgnoRoot==PEND
367e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
367f0 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  t) ){.      pgno
36800 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Root++;.    }.  
36810 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f    assert( pgnoRo
36820 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a  ot>=3 );..    /*
36830 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65   Allocate a page
36840 2e 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  . The page that 
36850 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65  currently reside
36860 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69  s at pgnoRoot wi
36870 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76  ll.    ** be mov
36880 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  ed to the alloca
36890 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73  ted page (unless
368a0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
368b0 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20  age happens.    
368c0 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74 20  ** to reside at 
368d0 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a  pgnoRoot)..    *
368e0 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  /.    rc = alloc
368f0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
36900 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70  , &pPageMove, &p
36910 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f  gnoMove, pgnoRoo
36920 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 1);.    if( r
36930 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36940 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36950 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
36960 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f  pgnoMove!=pgnoRo
36970 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  ot ){.      /* p
36980 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70  gnoRoot is the p
36990 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
369a0 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f   used for the ro
369b0 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20  ot-page of.     
369c0 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c   ** the new tabl
369d0 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65  e (assuming an e
369e0 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63  rror did not occ
369f0 75 72 29 2e 20 42 75 74 20 77 65 20 77 65 72 65  ur). But we were
36a00 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  .      ** alloca
36a10 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66  ted pgnoMove. If
36a20 20 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20   required (i.e. 
36a30 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c  if it was not al
36a40 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  located.      **
36a50 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68   by extending th
36a60 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72  e file), the cur
36a70 72 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73  rent page at pos
36a80 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20  ition pgnoMove. 
36a90 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61       ** is alrea
36aa0 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20  dy journaled..  
36ab0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20      */.      u8 
36ac0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e  eType;.      Pgn
36ad0 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
36ae0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
36af0 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20  PageMove);..    
36b00 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61    /* Move the pa
36b10 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20  ge currently at 
36b20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f  pgnoRoot to pgno
36b30 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72  Move. */.      r
36b40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
36b50 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
36b60 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
36b70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
36b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36b90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
36bb0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
36bc0 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54  t, pgnoRoot, &eT
36bd0 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
36be0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
36bf0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
36c00 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
36c10 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
36c20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
36c30 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
36c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36c50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36c60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
36c70 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
36c80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
36c90 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
36ca0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
36cb0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
36cc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
36cd0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
36ce0 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
36cf0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
36d00 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65  ge(pBt, pRoot, e
36d10 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
36d20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  pgnoMove, 0);.  
36d30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
36d40 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pRoot);..      /
36d50 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67  * Obtain the pag
36d60 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f  e at pgnoRoot */
36d70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
36d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36d90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
36db0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
36dc0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
36dd0 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
36de0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
36df0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36e00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
36e20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36e30 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
36e40 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
36e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36e60 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
36e70 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
36e80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36e90 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
36ea0 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  {.      pRoot = 
36eb0 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d  pPageMove;.    }
36ec0 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65   ..    /* Update
36ed0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
36ee0 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77   and meta-data w
36ef0 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  ith the new root
36f00 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f  -page number. */
36f10 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
36f20 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Put(pBt, pgnoRoo
36f30 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  t, PTRMAP_ROOTPA
36f40 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
36f50 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
36f60 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
36f70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36f80 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
36f90 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
36fa0 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e  teMeta(p, 4, pgn
36fb0 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
36fc0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
36fd0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
36fe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36ff0 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
37000 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
37010 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
37020 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
37030 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
37040 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37050 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
37060 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
37070 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37080 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
37090 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  );.  zeroPage(pR
370a0 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46  oot, flags | PTF
370b0 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65  _LEAF);.  sqlite
370c0 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f  3PagerUnref(pRoo
370d0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  t->pDbPage);.  *
370e0 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
370f0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
37100 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
37110 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
37120 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
37130 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
37140 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
37150 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
37160 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
37170 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 72 65  .  rc = btreeCre
37180 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61  ateTable(p, piTa
37190 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73  ble, flags);.  s
371a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
371b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
371c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
371d0 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
371e0 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  ase page and all
371f0 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20   its children.  
37200 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61  Return.** the pa
37210 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
37220 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
37230 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  t clearDatabaseP
37240 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
37250 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
37260 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61  /* The BTree tha
37270 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
37280 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  able */.  Pgno p
37290 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
372a0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
372b0 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69 6e 74  o clear */.  int
372c0 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c 20 20   freePageFlag,  
372d0 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
372e0 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
372f0 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65  .  int *pnChange
37300 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
37310 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
37320 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
37330 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
37340 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
37350 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
37360 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
37370 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67  ;.  if( pgno>pag
37380 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
37390 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
373a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
373b0 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
373c0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
373d0 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
373e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
373f0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
37400 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
37410 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
37420 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
37430 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
37440 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
37450 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
37460 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
37470 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
37480 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
37490 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67  ell), 1, pnChang
374a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
374b0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
374c0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
374d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c     }.    rc = cl
374e0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
374f0 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
37500 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
37510 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
37520 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
37530 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63  ->leaf ){.    rc
37540 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
37550 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
37560 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
37570 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67  [8]), 1, pnChang
37580 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
37590 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
375a0 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
375b0 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61 6e 67  else if( pnChang
375c0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
375d0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
375e0 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65 20  ;.    *pnChange 
375f0 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b  += pPage->nCell;
37600 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50  .  }.  if( freeP
37610 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  ageFlag ){.    r
37620 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
37630 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ge);.  }else if(
37640 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
37650 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
37660 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a  pDbPage))==0 ){.
37670 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
37680 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ge, pPage->aData
37690 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  [0] | PTF_LEAF);
376a0 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62  .  }..cleardatab
376b0 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72  asepage_out:.  r
376c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
376d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
376e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
376f0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
37700 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
37710 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
37720 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a  ase.  iTable is.
37730 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
37740 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f  er of the root o
37750 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66  f the table.  Af
37760 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
37770 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65   returns,.** the
37780 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
37790 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65  pty, but still e
377a0 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  xists..**.** Thi
377b0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
377c0 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
377d0 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
377e0 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
377f0 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
37800 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e  the table.  Open
37810 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
37820 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
37830 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  ** root of the t
37840 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  able..**.** If p
37850 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e  nChange is not N
37860 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65 20  ULL, then table 
37870 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61  iTable must be a
37880 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20  n intkey table. 
37890 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76  The.** integer v
378a0 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  alue pointed to 
378b0 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20 69  by pnChange is i
378c0 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68  ncremented by th
378d0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65  e number of.** e
378e0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74 61  ntries in the ta
378f0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
37900 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
37910 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
37920 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 6e   iTable, int *pn
37930 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20 72  Change){.  int r
37940 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
37950 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
37960 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
37970 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
37980 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
37990 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
379a0 28 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65  (rc = checkForRe
379b0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
379c0 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53  Table, 0, 1))!=S
379d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
379e0 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
379f0 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
37a00 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
37a10 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
37a20 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
37a30 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
37a40 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
37a50 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  lse{.    rc = cl
37a60 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
37a70 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
37a80 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65 29 3b  e, 0, pnChange);
37a90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
37aa0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
37ab0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37ac0 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66  ** Erase all inf
37ad0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61  ormation in a ta
37ae0 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ble and add the 
37af0 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
37b00 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65  e to.** the free
37b10 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74  list.  Except, t
37b20 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70  he root of the p
37b30 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28  rinciple table (
37b40 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61  the one on.** pa
37b50 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61  ge 1) is never a
37b60 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
37b70 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
37b80 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
37b90 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
37ba0 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
37bb0 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63  re any open.** c
37bc0 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
37bd0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55  ble..**.** If AU
37be0 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62  TOVACUUM is enab
37bf0 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  led and the page
37c00 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f   at iTable is no
37c10 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f  t the last.** ro
37c20 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ot page in the d
37c30 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
37c40 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  en the last root
37c50 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65   page .** in the
37c60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
37c70 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65  s moved into the
37c80 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f   slot formerly o
37c90 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54  ccupied by.** iT
37ca0 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61  able and that la
37cb0 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  st slot formerly
37cc0 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65   occupied by the
37cd0 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a   last root page.
37ce0 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
37cf0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74  he freelist inst
37d00 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20  ead of iTable.  
37d10 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c  In this say, all
37d20 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61  .** root pages a
37d30 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62  re kept at the b
37d40 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
37d50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
37d60 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73  hich.** is neces
37d70 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43  sary for AUTOVAC
37d80 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68  UUM to work righ
37d90 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20  t.  *piMoved is 
37da0 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70  set to the .** p
37db0 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
37dc0 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  used to be the l
37dd0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ast root page in
37de0 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
37df0 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49  .** the move.  I
37e00 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d  f no page gets m
37e10 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69  oved, *piMoved i
37e20 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54  s set to 0..** T
37e30 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
37e40 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e  e is recorded in
37e50 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65   meta[3] and the
37e60 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74   value of.** met
37e70 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20  a[3] is updated 
37e80 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  by this procedur
37e90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
37ea0 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
37eb0 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
37ec0 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
37ed0 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
37ee0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
37ef0 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
37f00 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
37f10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37f20 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
37f30 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
37f40 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
37f50 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20  ANS_WRITE );..  
37f60 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
37f70 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
37f80 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20   if any cursors 
37f90 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
37fa0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
37fb0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
37fc0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
37fd0 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d  de the backend m
37fe0 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ay.  ** need to 
37ff0 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f  move another roo
38000 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61  t-page to fill a
38010 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
38020 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f   deleted.  ** ro
38030 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f  ot page. If an o
38040 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75  pen cursor was u
38050 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61  sing this page a
38060 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a   problem would .
38070 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f    ** occur..  */
38080 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
38090 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
380a0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
380b0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
380c0 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d  pCursor->pBtree-
380d0 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
380e0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
380f0 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
38100 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
38110 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
38120 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26   (Pgno)iTable, &
38130 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
38140 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
38150 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
38160 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70  treeClearTable(p
38170 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
38180 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
38190 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
381a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
381b0 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64  .  }..  *piMoved
381c0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61   = 0;..  if( iTa
381d0 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20  ble>1 ){.#ifdef 
381e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
381f0 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20  VACUUM.    rc = 
38200 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
38210 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
38220 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20  (pPage);.#else. 
38230 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
38240 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
38250 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  Pgno maxRootPgno
38260 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
38270 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
38280 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53  (p, BTREE_LARGES
38290 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 6d 61  T_ROOT_PAGE, &ma
382a0 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
382b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
382c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
382d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
382e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
382f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
38300 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d       if( iTable=
38310 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a  =maxRootPgno ){.
38320 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
38330 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
38340 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62  opped is the tab
38350 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  le with the larg
38360 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
38370 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
38380 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
38390 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61   put the root pa
383a0 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ge on the free l
383b0 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ist. .        */
383c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
383d0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
383e0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
383f0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
38400 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
38410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
38420 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
38430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
38440 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
38450 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
38460 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20  ropped does not 
38470 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74  have the largest
38480 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
38490 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
384a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f  the database. So
384b0 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74   move the page t
384c0 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68  hat does into th
384d0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61  e .        ** ga
384e0 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
384f0 6c 65 74 65 64 20 72 6f 6f