/ Hex Artifact Content
Login

Artifact 5afa1b5b68217afc9dc96e18ab1ab2f888709139:


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 31 30 20 32 30 30 39 2f 30  c,v 1.610 2009/0
0190: 36 2f 30 33 20 31 31 3a 32 35 3a 30 37 20 64 61  6/03 11:25:07 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 30  ite3BtreeTrace=0
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 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 70 50 74 72 6d 61 70 20  key);.  pPtrmap 
48b0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
48c0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
48d0: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
48e0: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
48f0: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
4900: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
4910: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
4920: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
4930: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
4940: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
4950: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
4960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4970: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
4980: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
4990: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
49a0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
49b0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
49c0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
49d0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
49e0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
49f0: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67   }..  sqlite3Pag
4a00: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
4a10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4a20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
4a30: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
4a40: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
4a50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
4a60: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
4a70: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
4a80: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
4a90: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
4aa0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
4ab0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
4ac0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
4ad0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
4ae0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
4af0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
4b00: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4b10: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
4b20: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
4b30: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
4b40: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b50: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
4b60: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
4b70: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
4b80: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
4b90: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
4ba0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
4bb0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
4bc0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
4bd0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
4be0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
4bf0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
4c00: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
4c10: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
4c20: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
4c30: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
4c40: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4c50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4c60: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
4c70: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
4c80: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
4c90: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
4ca0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
4cb0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
4cc0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
4cd0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
4ce0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
4cf0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
4d00: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
4d10: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
4d20: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
4d30: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
4d40: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
4d50: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  y);.  assert( pE
4d60: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
4d70: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
4d80: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
4d90: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
4da0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
4db0: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
4dc0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
4dd0: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
4de0: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
4df0: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
4e00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
4e10: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
4e20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
4e30: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
4e40: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
4e50: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
4e60: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
4e70: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
4e80: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
4e90: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
4ea0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
4eb0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
4ec0: 6c 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  l(y,z) SQLITE_OK
4ed0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
4ee0: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
4ef0: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
4f00: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
4f10: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
4f20: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
4f30: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
4f40: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
4f50: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
4f60: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
4f70: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
4f80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
4f90: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
4fa0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
4fb0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
4fc0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
4fd0: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
4fe0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
4ff0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
5000: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
5010: 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c  ->aData[(P)->cel
5020: 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29  lOffset+2*(I)]))
5030: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  )../*.** This a 
5040: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
5050: 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c  sion of findCell
5060: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
5070: 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20  r.** pages that 
5080: 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  do contain overf
5090: 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20  low cells.  See 
50a0: 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63  insert.*/.static
50b0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
50c0: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
50d0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
50e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
50f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5100: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
5110: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5120: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
5130: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
5140: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
5150: 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66  .    struct _Ovf
5160: 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20  lCell *pOvfl;.  
5170: 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65    pOvfl = &pPage
5180: 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  ->aOvfl[i];.    
5190: 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a  k = pOvfl->idx;.
51a0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
51b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
51c0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
51d0: 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e    return pOvfl->
51e0: 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pCell;.      }. 
51f0: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
5200: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5210: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
5220: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
5230: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
5240: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
5250: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
5260: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
5270: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
5280: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
5290: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73  his function.  s
52a0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
52b0: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
52c0: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
52d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
52e0: 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33  ment and sqlite3
52f0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
5300: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
5310: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
5320: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
5330: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
5340: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
5350: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
5360: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
5370: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
5380: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
5390: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
53a0: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
53b0: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
53c0: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
53d0: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64   faster..*/.void
53e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
53f0: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
5400: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
5410: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
5420: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
5430: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5450: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
5460: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
5470: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
5480: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
5490: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
54a0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
54d0: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
54e0: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
54f0: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
5500: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5510: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
5520: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
5530: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5540: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
5550: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
5560: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
5570: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
5580: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
5590: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
55a0: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
55b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
55c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
55d0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
55e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
55f0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
5600: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
5610: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
5620: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
5630: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
5640: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5650: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
5660: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
5670: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
5680: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
5690: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
56a0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
56b0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
56c0: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
56d0: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
56e0: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
56f0: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
5700: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
5710: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
5720: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
5730: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
5740: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
5750: 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  n;.  if( likely(
5760: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
5770: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
5780: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
5790: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
57a0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
57b0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
57c0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
57d0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
57e0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
57f0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
5800: 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
5810: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
5820: 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  ze of cell conte
5830: 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  nt in bytes */. 
5840: 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c     nSize = nPayl
5850: 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  oad + n;.    pIn
5860: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
5870: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
5880: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
5890: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e   = 0;.    if( (n
58a0: 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b  Size & ~3)==0 ){
58b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
58c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
58d0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
58e0: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
58f0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
5900: 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  u16)nSize;.  }el
5910: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
5920: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
5930: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
5940: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
5950: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
5960: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
5970: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
5980: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
5990: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
59a0: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
59b0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
59c0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
59d0: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
59e0: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
59f0: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
5a00: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
5a10: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
5a20: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
5a30: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
5a40: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
5a50: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
5a60: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
5a70: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
5a80: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
5a90: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
5aa0: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
5ab0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
5ac0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
5ad0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
5ae0: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
5af0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
5b00: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
5b10: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5b20: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
5b30: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
5b40: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
5b50: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5b60: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
5b70: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
5b80: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
5b90: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
5ba0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
5bb0: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
5bc0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
5bd0: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
5be0: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
5bf0: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
5c00: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
5c10: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
5c20: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
5c30: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
5c40: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
5c50: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
5c60: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
5c70: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
5c80: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
5c90: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
5ca0: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
5cb0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
5cc0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
5cd0: 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f  (u16)(pInfo->nLo
5ce0: 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49  cal + n);.    pI
5cf0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
5d00: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
5d10: 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  4;.  }.}.#define
5d20: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
5d30: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20  , iCell, pInfo) 
5d40: 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  \.  sqlite3Btree
5d50: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50  ParseCellPtr((pP
5d60: 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28  age), findCell((
5d70: 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29  pPage), (iCell))
5d80: 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20  , (pInfo)).void 
5d90: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
5da0: 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  eCell(.  MemPage
5db0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
5dc0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
5dd0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
5de0: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
5df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5e00: 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69   cell index.  Fi
5e10: 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f  rst cell is 0 */
5e20: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
5e30: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
5e40: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
5e50: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72  ture */.){.  par
5e60: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
5e70: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ell, pInfo);.}..
5e80: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
5e90: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
5ea0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
5eb0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
5ec0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
5ed0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
5ee0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
5ef0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
5f00: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
5f10: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
5f20: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
5f30: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
5f40: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
5f50: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
5f60: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
5f70: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
5f80: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
5f90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
5fa0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
5fb0: 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b  *pIter = &pCell[
5fc0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
5fd0: 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a  ize];.  u32 nSiz
5fe0: 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e;..#ifdef SQLIT
5ff0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
6000: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
6010: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
6020: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
6030: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
6040: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
6050: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
6060: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
6070: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
6080: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
6090: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
60a0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
60b0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
60c0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
60d0: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
60e0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
60f0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
6100: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
6110: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
6120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
6130: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
6140: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
6150: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
6160: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
6170: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
6180: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
6190: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
61a0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
61b0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
61c0: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
61d0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
61e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
61f0: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
6200: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
6210: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
6220: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
6230: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
6240: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
6250: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
6260: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
6270: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
6280: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
6290: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
62a0: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
62b0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
62c0: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
62d0: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
62e0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
62f0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
6300: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
6310: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
6320: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
6330: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
6340: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
6350: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
6360: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
6370: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
6380: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
6390: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
63a0: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
63b0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
63c0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
63d0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
63e0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
63f0: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
6400: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 70 49 74  .  nSize += (pIt
6410: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20  er - pCell);..  
6420: 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  /* The minimum s
6430: 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20  ize of any cell 
6440: 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  is 4 bytes. */. 
6450: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a   if( nSize<4 ){.
6460: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20      nSize = 4;. 
6470: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53   }..  assert( nS
6480: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
6490: 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e  Size );.  return
64a0: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 23   (u16)nSize;.}.#
64b0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
64c0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
64d0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
64e0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
64f0: 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50  return cellSizeP
6500: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
6510: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
6520: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
6530: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6540: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
6550: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
6560: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
6570: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
6580: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
6590: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
65a0: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
65b0: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
65c0: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
65d0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
65e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
65f0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
6600: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
6610: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43   u8 *pCell){.  C
6620: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
6630: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
6640: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
6650: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
6660: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
6670: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
6680: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
6690: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
66a0: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
66b0: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
66c0: 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
66d0: 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
66e0: 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c  o.nKey))>info.nL
66f0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f  ocal ){.    Pgno
6700: 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
6710: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
6720: 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65  erflow]);.    re
6730: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
6740: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
6750: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
6760: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
6770: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6780: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a  LITE_OK;.}./*.**
6790: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74   If the cell wit
67a0: 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e  h index iCell on
67b0: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
67c0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
67d0: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
67e0: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
67f0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
6800: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
6810: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
6820: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
6830: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66  int ptrmapPutOvf
6840: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
6850: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
6860: 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73  u8 *pCell;.  ass
6870: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6880: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
6890: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
68a0: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72  pCell = findOver
68b0: 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20  flowCell(pPage, 
68c0: 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  iCell);.  return
68d0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
68e0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
68f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
6900: 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65  * Defragment the
6910: 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c   page given.  Al
6920: 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65  l Cells are move
6930: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  d to the.** end 
6940: 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  of the page and 
6950: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69  all free space i
6960: 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f  s collected into
6970: 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65   one.** big Free
6980: 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20  Blk that occurs 
6990: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68  in between the h
69a0: 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a  eader and cell.*
69b0: 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  * pointer array 
69c0: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
69d0: 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74  tent area..*/.st
69e0: 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d  atic int defragm
69f0: 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  entPage(MemPage 
6a00: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
6a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6a20: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
6a30: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
6a40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
6a50: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
6a60: 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20   of a i-th cell 
6a70: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20  */.  int addr;  
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
6aa0: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65  st byte after ce
6ab0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
6ac0: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
6af0: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
6b00: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6b20: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
6b30: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
6b40: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
6b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
6b60: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
6b70: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
6b80: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
6b90: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
6ba0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
6bb0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
6bc0: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
6bd0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
6be0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
6bf0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
6c00: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
6c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6c20: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
6c30: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
6c40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
6c50: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
6c60: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
6c70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
6c80: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
6c90: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
6ca0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61   content */..  a
6cb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
6cc0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
6cd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
6ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
6cf0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
6d00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
6d10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
6d20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
6d30: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
6d40: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
6d50: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
6d60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6d70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
6d80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
6d90: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  emp = sqlite3Pag
6da0: 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67  erTempSpace(pPag
6db0: 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  e->pBt->pPager);
6dc0: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
6dd0: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
6de0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6df0: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
6e00: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
6e10: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
6e20: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
6e30: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
6e40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
6e50: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
6e60: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
6e70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
6e80: 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28  cbrk = get2byte(
6e90: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
6ea0: 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62   memcpy(&temp[cb
6eb0: 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d  rk], &data[cbrk]
6ec0: 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63  , usableSize - c
6ed0: 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75  brk);.  cbrk = u
6ee0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72  sableSize;.  for
6ef0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
6f00: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
6f10: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
6f20: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
6f30: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
6f40: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
6f50: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
6f60: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
6f70: 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 3d 75  );.    if( pc>=u
6f80: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
6f90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6fa0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6fb0: 20 20 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20     }.    size = 
6fc0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
6fd0: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
6fe0: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
6ff0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 63 65  .    if( cbrk<ce
7000: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
7010: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
7020: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
7030: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7040: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
7050: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  }.    assert( cb
7060: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
7070: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 30 20 29  ize && cbrk>=0 )
7080: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
7090: 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b  ta[cbrk], &temp[
70a0: 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  pc], size);.    
70b0: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
70c0: 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73  cbrk);.  }.  ass
70d0: 65 72 74 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f  ert( cbrk>=cellO
70e0: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b  ffset+2*nCell );
70f0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
7100: 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b  a[hdr+5], cbrk);
7110: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
7120: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
7130: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
7140: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72  r+7] = 0;.  addr
7150: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a   = cellOffset+2*
7160: 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28  nCell;.  memset(
7170: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20  &data[addr], 0, 
7180: 63 62 72 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73  cbrk-addr);.  as
7190: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
71a0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
71b0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
71c0: 0a 20 20 69 66 28 20 63 62 72 6b 2d 61 64 64 72  .  if( cbrk-addr
71d0: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
71e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
71f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7200: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
7210: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7220: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
7230: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
7240: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
7250: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
7260: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
7270: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65  rst argument. Re
7280: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
7290: 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
72a0: 5b 5d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 69  [] of the .** fi
72b0: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
72c0: 63 61 74 65 64 20 73 70 61 63 65 2e 20 0a 2a 2a  cated space. .**
72d0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
72e0: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
72f0: 68 65 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  he space between
7300: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
7310: 63 65 6c 6c 2d 6f 66 66 73 65 74 20 0a 2a 2a 20  cell-offset .** 
7320: 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 73 74  array and the st
7330: 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  art of the cell-
7340: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20  content area is 
7350: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
7360: 79 74 65 73 0a 2a 2a 20 69 6e 20 73 69 7a 65 2e  ytes.** in size.
7370: 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   So this routine
7380: 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
7390: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
73a0: 61 72 65 20 61 6c 72 65 61 64 79 20 36 30 20 6f  are already 60 o
73b0: 72 20 6d 6f 72 65 20 62 79 74 65 73 20 6f 66 20  r more bytes of 
73c0: 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 69 6e  fragments within
73d0: 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 74 68   the page,.** th
73e0: 65 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67  e page is defrag
73f0: 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20 72 65  mented before re
7400: 74 75 72 6e 69 6e 67 2e 20 49 66 20 74 68 69 73  turning. If this
7410: 20 77 65 72 65 20 6e 6f 74 20 64 6f 6e 65 20 74   were not done t
7420: 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 68 61  here.** is a cha
7430: 6e 63 65 20 74 68 61 74 20 74 68 65 20 6e 75 6d  nce that the num
7440: 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65  ber of fragmente
7450: 64 20 62 79 74 65 73 20 63 6f 75 6c 64 20 65 76  d bytes could ev
7460: 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 6f 76 65  entually .** ove
7470: 72 66 6c 6f 77 20 74 68 65 20 73 69 6e 67 6c 65  rflow the single
7480: 2d 62 79 74 65 20 66 69 65 6c 64 20 6f 66 20 74  -byte field of t
7490: 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 69  he page-header i
74a0: 6e 20 77 68 69 63 68 20 74 68 69 73 20 76 61 6c  n which this val
74b0: 75 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 2e  ue.** is stored.
74c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
74d0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
74e0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
74f0: 20 6e 42 79 74 65 29 7b 0a 20 20 63 6f 6e 73 74   nByte){.  const
7500: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
7510: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
7520: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
7530: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
7540: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
7550: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
7560: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
7570: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
7580: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
7590: 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20   int nFrag;     
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
75c0: 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  of fragmented by
75d0: 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a  tes on pPage */.
75e0: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 0a 20 20    int top;.  .  
75f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7600: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
7610: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7620: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
7630: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
7640: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7650: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7660: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7670: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
7680: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
7690: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
76a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
76b0: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
76c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
76d0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
76e0: 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
76f0: 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65 20   that the space 
7700: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
7710: 2d 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 6e  -offset array an
7720: 64 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c  d the .  ** cell
7730: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73  -content area is
7740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 42   greater than nB
7750: 79 74 65 20 62 79 74 65 73 2e 0a 20 20 2a 2f 0a  yte bytes..  */.
7760: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
7770: 3c 3d 20 28 0a 20 20 20 20 20 20 67 65 74 32 62  <= (.      get2b
7780: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
7790: 29 2d 28 68 64 72 2b 38 2b 28 70 50 61 67 65 2d  )-(hdr+8+(pPage-
77a0: 3e 6c 65 61 66 3f 30 3a 34 29 2b 32 2a 67 65 74  >leaf?0:4)+2*get
77b0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
77c0: 33 5d 29 29 0a 20 20 29 29 3b 0a 0a 20 20 70 50  3])).  ));..  pP
77d0: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75  age->nFree -= (u
77e0: 31 36 29 6e 42 79 74 65 3b 0a 20 20 6e 46 72 61  16)nByte;.  nFra
77f0: 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b  g = data[hdr+7];
7800: 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30  .  if( nFrag>=60
7810: 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67 6d 65   ){.    defragme
7820: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
7830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
7840: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
7850: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
7860: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
7870: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
7880: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
7890: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
78a0: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
78b0: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
78c0: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
78d0: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
78e0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
78f0: 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e  o accomadate it.
7900: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
7910: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
7920: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
7930: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
7940: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
7950: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
7960: 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74  t size = get2byt
7970: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 20  e(&data[pc+2]); 
7980: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66      /* Size of f
7990: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20  ree slot */.    
79a0: 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74    if( size>=nByt
79b0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
79c0: 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74   x = size - nByt
79d0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  e;.        if( x
79e0: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
79f0: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
7a00: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
7a10: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
7a20: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
7a30: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
7a40: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
7a50: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
7a60: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
7a70: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
7a80: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
7a90: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
7aa0: 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20   = (u8)(nFrag + 
7ab0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
7ac0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
7ad0: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
7ae0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
7af0: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
7b00: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
7b10: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
7b20: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
7b30: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
7b40: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
7b50: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
7b60: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
7b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7b80: 72 65 74 75 72 6e 20 70 63 20 2b 20 78 3b 0a 20  return pc + x;. 
7b90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7ba0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
7bb0: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
7bc0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
7bd0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
7be0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
7bf0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
7c00: 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  area..  */.  top
7c10: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
7c20: 61 5b 68 64 72 2b 35 5d 29 20 2d 20 6e 42 79 74  a[hdr+5]) - nByt
7c30: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
7c40: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
7c50: 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a  ;.  return top;.
7c60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7c70: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
7c80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
7c90: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
7ca0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
7cb0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
7cc0: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
7cd0: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
7ce0: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
7cf0: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
7d00: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
7d10: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
7d20: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
7d30: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
7d40: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
7d50: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
7d60: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
7d70: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
7d80: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
7d90: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7da0: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
7db0: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
7dc0: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
7dd0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7de0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
7df0: 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  Data;..  assert(
7e00: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
7e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7e20: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
7e30: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
7e40: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
7e50: 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68   start>=pPage->h
7e60: 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67  drOffset+6+(pPag
7e70: 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a  e->leaf?0:4) );.
7e80: 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74    assert( (start
7e90: 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d   + size)<=pPage-
7ea0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
7eb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
7ec0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7ed0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
7ee0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
7ef0: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
7f00: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
7f10: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64  ze is 4 */..#ifd
7f20: 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
7f30: 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65  _DELETE.  /* Ove
7f40: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
7f50: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
7f60: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53  zeros when the S
7f70: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20  ECURE_DELETE .  
7f80: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
7f90: 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
7fa0: 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  time */.  memset
7fb0: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
7fc0: 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  , size);.#endif.
7fd0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
7fe0: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
7ff0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
8000: 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20   freeblocks */. 
8010: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
8020: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
8030: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
8040: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
8050: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
8060: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
8070: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  egin>0 ){.    as
8080: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
8090: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
80a0: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 69 66  Size-4 );.    if
80b0: 28 20 70 62 65 67 69 6e 3c 3d 61 64 64 72 20 29  ( pbegin<=addr )
80c0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
80d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
80e0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
80f0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
8100: 7d 0a 20 20 69 66 20 28 20 70 62 65 67 69 6e 3e  }.  if ( pbegin>
8110: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
8120: 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a 20 20 20  leSize-4 ) {.   
8130: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8140: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
8150: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
8160: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
8170: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
8180: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
8190: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
81a0: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
81b0: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
81c0: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
81d0: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
81e0: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 28 75 31  ge->nFree += (u1
81f0: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
8200: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
8210: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
8220: 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68   addr = pPage->h
8230: 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20  drOffset + 1;.  
8240: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
8250: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8260: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
8270: 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a   int pnext, psiz
8280: 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74  e, x;.    assert
8290: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
82a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
82b0: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
82c0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
82d0: 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74  .    pnext = get
82e0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
82f0: 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20  in]);.    psize 
8300: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8310: 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20  [pbegin+2]);.   
8320: 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73   if( pbegin + ps
8330: 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74  ize + 3 >= pnext
8340: 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20   && pnext>0 ){. 
8350: 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20       int frag = 
8360: 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b  pnext - (pbegin+
8370: 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  psize);.      if
8380: 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66  ( (frag<0) || (f
8390: 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 70 50  rag>(int)data[pP
83a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37  age->hdrOffset+7
83b0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
83c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
83d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
83e0: 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50 61  }.      data[pPa
83f0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
8400: 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20   -= (u8)frag;.  
8410: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
8420: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a  (&data[pnext]);.
8430: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
8440: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29  data[pbegin], x)
8450: 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78  ;.      x = pnex
8460: 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  t + get2byte(&da
8470: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70  ta[pnext+2]) - p
8480: 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74  begin;.      put
8490: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
84a0: 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d  in+2], x);.    }
84b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
84c0: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d   = pbegin;.    }
84d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
84e0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
84f0: 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20  rea begins with 
8500: 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d  a freeblock, rem
8510: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  ove it. */.  if(
8520: 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61   data[hdr+1]==da
8530: 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74  ta[hdr+5] && dat
8540: 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68  a[hdr+2]==data[h
8550: 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74  dr+6] ){.    int
8560: 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e   top;.    pbegin
8570: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8580: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
8590: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
85a0: 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e  1], &data[pbegin
85b0: 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d  ], 2);.    top =
85c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
85d0: 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79  hdr+5]) + get2by
85e0: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
85f0: 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  2]);.    put2byt
8600: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
8610: 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  top);.  }.  asse
8620: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8630: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8640: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8660: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
8670: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
8680: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
8690: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
86a0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
86b0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
86c0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
86d0: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
86e0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
86f0: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
8700: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
8710: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
8720: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
8730: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
8740: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
8750: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
8760: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
8770: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
8780: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
8790: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
87a0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
87b0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
87c0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
87d0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
87e0: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
87f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
8800: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
8810: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
8820: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
8830: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
8840: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
8850: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
8860: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
8870: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
8880: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
8890: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
88a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
88b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
88c0: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
88d0: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
88e0: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
88f0: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
8900: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
8910: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
8920: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
8930: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
8940: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
8950: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
8960: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
8970: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
8980: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
8990: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
89a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
89b0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
89c0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
89d0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
89e0: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
89f0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
8a00: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
8a10: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
8a20: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
8a30: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
8a40: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
8a50: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a  e->hasData = 0;.
8a60: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
8a70: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
8a80: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
8a90: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
8aa0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
8ab0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
8ac0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8ad0: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
8ae0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8af0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
8b00: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
8b10: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
8b20: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
8b30: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
8b40: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
8b50: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
8b60: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
8b70: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
8b80: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
8b90: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
8ba0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
8bb0: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
8bc0: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
8bd0: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
8be0: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
8bf0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
8c00: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
8c10: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
8c20: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
8c30: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
8c40: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  uption..*/.int s
8c50: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
8c60: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8c70: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
8c80: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
8c90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8ca0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
8cb0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
8cc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8cd0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74  age->pgno==sqlit
8ce0: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
8cf0: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
8d00: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8d10: 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50  Page == sqlite3P
8d20: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
8d30: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
8d40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8d50: 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65  >aData == sqlite
8d60: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
8d70: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
8d80: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
8d90: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31  isInit ){.    u1
8da0: 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  6 pc;           
8db0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
8dc0: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
8dd0: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
8de0: 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20   */.    u8 hdr; 
8df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8e00: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
8e10: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
8e20: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61   */.    u8 *data
8e30: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
8e40: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
8e50: 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61  ata */.    BtSha
8e60: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
8e70: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
8e80: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
8e90: 20 20 20 20 75 31 36 20 75 73 61 62 6c 65 53 69      u16 usableSi
8ea0: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
8eb0: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
8ec0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
8ed0: 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  .    u16 cellOff
8ee0: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
8ef0: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
8f00: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
8f10: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
8f20: 20 20 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20    u16 nFree;    
8f30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8f40: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
8f50: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
8f60: 20 20 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20    u16 top;      
8f70: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
8f80: 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  te of the cell c
8f90: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a  ontent area */..
8fa0: 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d      pBt = pPage-
8fb0: 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d  >pBt;..    hdr =
8fc0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
8fd0: 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  t;.    data = pP
8fe0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
8ff0: 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
9000: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
9010: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
9020: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9030: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
9040: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
9050: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
9060: 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70 50  =32768 );.    pP
9070: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
9080: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
9090: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  1;.    pPage->nO
90a0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
90b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
90c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
90d0: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
90e0: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
90f0: 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
9100: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
9110: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9120: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
9130: 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
9140: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9150: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69  a[hdr+3]);.    i
9160: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
9170: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
9180: 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79        /* To many
9190: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
91a0: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
91b0: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
91c0: 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  upt */.      ret
91d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
91e0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
91f0: 20 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65   .    /* Compute
9200: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
9210: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
9220: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
9230: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9240: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
9250: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
9260: 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65  top - (cellOffse
9270: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
9280: 6c 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ll);.    while( 
9290: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
92a0: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
92b0: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
92c0: 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20  eSize-4 ){.     
92d0: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
92e0: 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65   is off the page
92f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
9300: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9310: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
9320: 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
9330: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
9340: 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20  );.      size = 
9350: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
9360: 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  c+2]);.      if(
9370: 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c   next>0 && next<
9380: 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20  =pc+size+3 ){.  
9390: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
93a0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
93b0: 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
93c0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
93d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
93e0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
93f0: 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73        nFree += s
9400: 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  ize;.      pc = 
9410: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  next;.    }.    
9420: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
9430: 75 31 36 29 6e 46 72 65 65 3b 0a 20 20 20 20 69  u16)nFree;.    i
9440: 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65  f( nFree>=usable
9450: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
9460: 20 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e   Free space cann
9470: 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20  ot exceed total 
9480: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  page size */.   
9490: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
94a0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
94b0: 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f      }..#if 0.  /
94c0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c 6c  * Check that all
94d0: 20 74 68 65 20 6f 66 66 73 65 74 73 20 69 6e 20   the offsets in 
94e0: 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65 74 20  the cell offset 
94f0: 61 72 72 61 79 20 61 72 65 20 77 69 74 68 69 6e  array are within
9500: 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a 20   range. .  ** . 
9510: 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20 74 68 69   ** Omitting thi
9520: 73 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 63 68  s consistency ch
9530: 65 63 6b 20 61 6e 64 20 75 73 69 6e 67 20 74 68  eck and using th
9540: 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  e pPage->maskPag
9550: 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74 6f 20 70  e mask.  ** to p
9560: 72 65 76 65 6e 74 20 6f 76 65 72 72 75 6e 6e 69  revent overrunni
9570: 6e 67 20 74 68 65 20 70 61 67 65 20 62 75 66 66  ng the page buff
9580: 65 72 20 69 6e 20 66 69 6e 64 43 65 6c 6c 28 29  er in findCell()
9590: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 0a 20 20   results in a.  
95a0: 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f 72 6d 61  ** 2.5% performa
95b0: 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20  nce gain..  */. 
95c0: 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f 66 66 3b   {.    u8 *pOff;
95d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
95e0: 74 6f 72 20 75 73 65 64 20 74 6f 20 63 68 65 63  tor used to chec
95f0: 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65  k all cell offse
9600: 74 73 20 61 72 65 20 69 6e 20 72 61 6e 67 65 20  ts are in range 
9610: 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b  */.    u8 *pEnd;
9620: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9630: 65 72 20 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c  er to end of cel
9640: 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 2a  l offset array *
9650: 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b 3b 20 20  /.    u8 mask;  
9660: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
9670: 66 20 62 69 74 73 20 74 68 61 74 20 6d 75 73 74  f bits that must
9680: 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20   be zero in MSB 
9690: 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20  of cell offsets 
96a0: 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20 7e 28  */.    mask = ~(
96b0: 28 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53  ((u8)(pBt->pageS
96c0: 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 20  ize>>8))-1);.   
96d0: 20 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65   pEnd = &data[ce
96e0: 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50 61 67 65  llOffset + pPage
96f0: 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20  ->nCell*2];.    
9700: 66 6f 72 28 70 4f 66 66 3d 26 64 61 74 61 5b 63  for(pOff=&data[c
9710: 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66  ellOffset]; pOff
9720: 21 3d 70 45 6e 64 20 26 26 20 21 28 28 2a 70 4f  !=pEnd && !((*pO
9730: 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b  ff)&mask); pOff+
9740: 3d 32 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 66  =2);.    if( pOf
9750: 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  f!=pEnd ){.     
9760: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9770: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9780: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
9790: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
97a0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
97b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
97c0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
97d0: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
97e0: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
97f0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
9800: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
9810: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
9820: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
9830: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9840: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
9850: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
9860: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
9870: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
9880: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
9890: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
98a0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
98b0: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
98c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
98d0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
98e0: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
98f0: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
9900: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9910: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
9920: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
9930: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
9940: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9950: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
9960: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
9970: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
9980: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
9990: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
99a0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
99b0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
99c0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
99d0: 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74  x) );.  /*memset
99e0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
99f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
9a00: 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61  - hdr);*/.  data
9a10: 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
9a20: 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
9a30: 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61  dr + 8 + 4*((fla
9a40: 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20  gs&PTF_LEAF)==0 
9a50: 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ?1:0);.  memset(
9a60: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
9a70: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
9a80: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
9a90: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
9aa0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
9ab0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
9ac0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
9ad0: 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64  ize - first;.  d
9ae0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
9af0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
9b00: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68  e->hdrOffset = h
9b10: 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  dr;.  pPage->cel
9b20: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
9b30: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
9b40: 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
9b50: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
9b60: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
9b70: 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b  geSize<=32768 );
9b80: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
9b90: 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ge = pBt->pageSi
9ba0: 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d  ze - 1;.  pPage-
9bb0: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
9bc0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
9bd0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
9be0: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
9bf0: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
9c00: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
9c10: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
9c20: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
9c30: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
9c40: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
9c50: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
9c60: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
9c70: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
9c80: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
9c90: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
9ca0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
9cb0: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
9cc0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
9cd0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
9ce0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
9cf0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
9d00: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
9d10: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
9d20: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
9d30: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
9d40: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
9d50: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
9d60: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
9d70: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
9d80: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
9d90: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
9da0: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
9db0: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
9dc0: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
9dd0: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a   if needed..**.*
9de0: 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65  * If the noConte
9df0: 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nt flag is set, 
9e00: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
9e10: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
9e20: 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
9e30: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
9e40: 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
9e50: 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
9e60: 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
9e70: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
9e80: 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
9e90: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
9ea0: 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
9eb0: 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
9ec0: 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
9ed0: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
9ee0: 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
9ef0: 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
9f00: 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
9f10: 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
9f20: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
9f30: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
9f40: 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
9f50: 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   point..*/.int s
9f60: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
9f70: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
9f80: 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
9f90: 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
9fa0: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
9fb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
9fc0: 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
9fd0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
9fe0: 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
9ff0: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
a000: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
a010: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
a020: 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  nt        /* Do 
a030: 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f  not load page co
a040: 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f  ntent if true */
a050: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a060: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
a070: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
a080: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a090: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a0a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
a0b0: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
a0c0: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
a0d0: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
a0e0: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
a0f0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a100: 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
a110: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
a120: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
a130: 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
a140: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a150: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
a160: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
a170: 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
a180: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
a190: 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
a1a0: 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
a1b0: 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
a1c0: 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
a1d0: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
a1e0: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
a1f0: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
a200: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
a210: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
a220: 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
a230: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
a240: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
a250: 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
a260: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a270: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
a280: 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
a290: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
a2a0: 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
a2b0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
a2c0: 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
a2d0: 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
a2e0: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
a2f0: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
a300: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
a310: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
a320: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
a330: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
a340: 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
a350: 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
a360: 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
a370: 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
a380: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
a390: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42 74  agerPagecount(Bt
a3a0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
a3b0: 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b 0a  int nPage = -1;.
a3c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
a3d0: 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
a3e0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
a3f0: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
a400: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
a410: 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
a420: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
a430: 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20 20   nPage==-1 );.  
a440: 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50 61  return (Pgno)nPa
a450: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ge;.}../*.** Get
a460: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
a470: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
a480: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
a490: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75  routine.** is ju
a4a0: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  st a convenience
a4b0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
a4c0: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
a4d0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
a4e0: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 73  eGetPage() and s
a4f0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
a500: 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
a510: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
a520: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
a530: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
a540: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
a550: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
a560: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
a570: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
a580: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
a590: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
a5a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
a5b0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
a5c0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
a5d0: 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
a5e0: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
a5f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a600: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
a610: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
a620: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a630: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
a640: 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PT; .  }..  /* I
a650: 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63  t is often the c
a660: 61 73 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ase that the pag
a670: 65 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72  e we want is alr
a680: 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20  eady in cache.. 
a690: 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69   ** If so, get i
a6a0: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
a6b0: 73 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20  s saves us from 
a6c0: 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20  having to call. 
a6d0: 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75   ** pagerPagecou
a6e0: 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72  nt() to make sur
a6f0: 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e  e pgno is within
a700: 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72   limits, which r
a710: 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61  esults.  ** in a
a720: 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65 72   measureable per
a730: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
a740: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a 70  ments..  */.  *p
a750: 70 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20  pPage = pPage = 
a760: 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
a770: 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  pBt, pgno);.  if
a780: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2f  ( pPage ){.    /
a790: 2a 20 50 61 67 65 20 69 73 20 61 6c 72 65 61 64  * Page is alread
a7a0: 79 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  y in cache */.  
a7b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
a7c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
a7d0: 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e 20 63 61  * Page not in ca
a7e0: 63 68 65 2e 20 20 41 63 71 75 69 72 65 20 69 74  che.  Acquire it
a7f0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
a800: 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
a810: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
a820: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
a830: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
a840: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
a850: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
a860: 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
a870: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
a880: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a890: 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61 67    pPage = *ppPag
a8a0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  e;.  }.  if( !pP
a8b0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
a8c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
a8d0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
a8e0: 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
a8f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a900: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
a910: 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70 50  pPage);.    *ppP
a920: 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
a930: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a940: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
a950: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
a960: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
a970: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
a980: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
a990: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e  te3BtreeGetPage.
a9a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a9b0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
a9c0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
a9d0: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
a9e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
a9f0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73  Overflow==0 || s
aa00: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
aa10: 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70  efcount(pPage->p
aa20: 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20 20  DbPage)>1 );.   
aa30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
aa40: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
aa50: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
aa60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
aa70: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
aa80: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
aa90: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
aaa0: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
aab0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
aac0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
aad0: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
aae0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
aaf0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ab00: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
ab10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
ab20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
ab30: 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
ab40: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
ab50: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
ab60: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
ab70: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
ab80: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
ab90: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
aba0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
abb0: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
abc0: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
abd0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
abe0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
abf0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
ac00: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
ac10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
ac20: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ac30: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
ac40: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
ac50: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
ac60: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
ac70: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
ac80: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
ac90: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
aca0: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
acb0: 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
acc0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
acd0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
ace0: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
acf0: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
ad00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ad10: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
ad20: 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
ad30: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
ad40: 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
ad50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ad60: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
ad70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
ad80: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
ad90: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
ada0: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
adb0: 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
adc0: 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
add0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
ade0: 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
adf0: 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
ae00: 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
ae10: 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
ae20: 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
ae30: 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
ae40: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
ae50: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
ae60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
ae70: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
ae80: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
ae90: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
aea0: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
aeb0: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
aec0: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
aed0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
aee0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
aef0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
af00: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
af10: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
af20: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
af30: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
af40: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
af50: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
af60: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
af70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
af80: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
af90: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
afa0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
afb0: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
afc0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
afd0: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
afe0: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
aff0: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
b000: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
b010: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
b020: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
b030: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b040: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
b050: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
b060: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b070: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
b080: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
b090: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
b0a0: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
b0b0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
b0c0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
b0d0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
b0e0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
b0f0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
b100: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
b110: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
b120: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
b130: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
b140: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
b150: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
b160: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
b170: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
b180: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
b190: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
b1a0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
b1b0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
b1c0: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
b1d0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
b1e0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
b1f0: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
b200: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
b210: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
b220: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
b230: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
b240: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
b250: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
b260: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
b270: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
b280: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
b290: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
b2a0: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
b2b0: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
b2c0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
b2d0: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
b2e0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
b2f0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b300: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
b310: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
b320: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
b330: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
b340: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
b350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
b360: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
b370: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
b380: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
b390: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
b3a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
b3b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
b3c0: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
b3d0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
b3e0: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
b3f0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b400: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
b410: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
b420: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
b430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b440: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
b450: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
b460: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
b470: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
b480: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
b490: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
b4a0: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
b4b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b4c0: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
b4d0: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
b4e0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
b4f0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
b500: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
b510: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
b520: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
b550: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
b560: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
b570: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
b580: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
b590: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
b5a0: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
b5b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b5d0: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
b5e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
b5f0: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b610: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
b620: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
b630: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
b640: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
b650: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
b660: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
b670: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53  ntent */..  /* S
b680: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
b690: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
b6a0: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
b6b0: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
b6c0: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
b6d0: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
b6e0: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
b6f0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
b700: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
b710: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
b720: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
b730: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
b740: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
b750: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
b760: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
b770: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
b780: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
b790: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b7a0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
b7b0: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
b7c0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
b7d0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
b7e0: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
b7f0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
b800: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
b810: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
b820: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
b830: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
b840: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
b850: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
b860: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b870: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
b880: 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64  ) );..  pVfs = d
b890: 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  b->pVfs;.  p = s
b8a0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
b8b0: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
b8c0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
b8d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b8e0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
b8f0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
b900: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
b910: 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  b;..#if !defined
b920: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
b930: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
b940: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b950: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
b960: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
b970: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
b980: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
b990: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
b9a0: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
b9b0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
b9c0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
b9d0: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
b9e0: 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26  f( isMemdb==0 &&
b9f0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
ba00: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
ba10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
ba20: 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
ba30: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
ba40: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
ba50: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
ba60: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
ba70: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
ba80: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
ba90: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
baa0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
bab0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
bac0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
bad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
bae0: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
baf0: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
bb00: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66  dCache;.      if
bb10: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
bb20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
bb30: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
bb40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bb50: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
bb60: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
bb70: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
bb80: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
bb90: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
bba0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
bbb0: 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
bbc0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
bbd0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
bbe0: 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
bbf0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
bc00: 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
bc10: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
bc20: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
bc30: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
bc40: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
bc50: 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
bc60: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
bc70: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
bc80: 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
bc90: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
bca0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
bcb0: 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
bcc0: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
bcd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
bce0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
bcf0: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
bd00: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
bd10: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
bd20: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
bd30: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
bd40: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
bd50: 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
bd60: 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
bd70: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
bd80: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44            for(iD
bd90: 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b=db->nDb-1; iDb
bda0: 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20  >=0; iDb--){.   
bdb0: 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a           Btree *
bdc0: 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e  pExisting = db->
bdd0: 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
bde0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
bdf0: 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73  xisting && pExis
be00: 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29  ting->pBt==pBt )
be10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
be20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
be30: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
be40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
be50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
be60: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
be80: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
be90: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
bea0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
beb0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
bec0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
bed0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
bef0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bf00: 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
bf10: 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  Bt;.          pB
bf20: 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  t->nRef++;.     
bf30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bf40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bf50: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
bf60: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
bf70: 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  red);.      sqli
bf80: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
bf90: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  thname);.    }.#
bfa0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
bfb0: 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
bfc0: 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d     /* In debug m
bfd0: 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c  ode, we mark all
bfe0: 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61   persistent data
bff0: 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c  bases as sharabl
c000: 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
c010: 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f  when they are no
c020: 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73  t.  This exercis
c030: 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
c040: 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ode and.      **
c050: 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f   gives more oppo
c060: 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65  rtunity for asse
c070: 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  rts(sqlite3_mute
c080: 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20  x_held()).      
c090: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  ** statements to
c0a0: 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72   find locking pr
c0b0: 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f  oblems..      */
c0c0: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
c0d0: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  le = 1;.    }.#e
c0e0: 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
c0f0: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
c100: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
c110: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
c120: 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
c130: 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
c140: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
c150: 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  are.    ** the r
c160: 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
c170: 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
c180: 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
c190: 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
c1a0: 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
c1b0: 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ing on a differe
c1c0: 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nt architecture.
c1d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
c1e0: 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d  rt( sizeof(i64)=
c1f0: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34  =8 || sizeof(i64
c200: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
c210: 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
c220: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34  =8 || sizeof(u64
c230: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
c240: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
c250: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
c260: 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
c270: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c280: 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
c290: 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
c2a0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
c2b0: 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
c2c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
c2d0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
c2e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c2f0: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
c300: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
c310: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
c320: 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
c330: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
c340: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c360: 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
c370: 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a  ags, vfsFlags);.
c380: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c390: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
c3a0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c3b0: 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
c3c0: 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
c3d0: 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
c3e0: 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
c3f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c400: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
c410: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
c420: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
c430: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73  ->db = db;.    s
c440: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
c450: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
c460: 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
c470: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
c480: 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
c490: 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71  = pBt;.  .    sq
c4a0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
c4b0: 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65  niter(pBt->pPage
c4c0: 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  r, pageReinit);.
c4d0: 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
c4e0: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
c4f0: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
c500: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73  Bt->readOnly = s
c510: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
c520: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
c530: 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  r);.    pBt->pag
c540: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
c550: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
c560: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
c570: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
c580: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
c590: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
c5a0: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
c5b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
c5c0: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
c5d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
c5e0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
c5f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c600: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
c610: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
c620: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
c630: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
c640: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
c650: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
c660: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
c670: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
c680: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
c690: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
c6a0: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
c6b0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
c6c0: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
c6d0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
c6e0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
c6f0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
c700: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
c710: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
c720: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
c730: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
c740: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
c750: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
c760: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
c770: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
c780: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
c790: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
c7a0: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
c7b0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
c7c0: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
c7d0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
c7e0: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
c7f0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
c800: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
c810: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
c820: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
c830: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
c840: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
c850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
c860: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
c870: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
c880: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
c890: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
c8a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
c8b0: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
c8c0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
c8d0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
c8e0: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
c8f0: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
c900: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
c910: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
c920: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
c930: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
c940: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
c950: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
c960: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
c970: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
c980: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
c990: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
c9a0: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
c9b0: 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
c9c0: 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
c9d0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
c9e0: 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d  ->pageSize & 7)=
c9f0: 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65  =0 );  /* 8-byte
ca00: 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61   alignment of pa
ca10: 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69  geSize */.   .#i
ca20: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ca30: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
ca40: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
ca50: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
ca60: 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
ca70: 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
ca80: 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
ca90: 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
caa0: 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
cab0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
cac0: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
cad0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
cae0: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20   *mutexShared;. 
caf0: 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d       pBt->nRef =
cb00: 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53   1;.      mutexS
cb10: 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
cb20: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
cb30: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
cb40: 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28  STER);.      if(
cb50: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
cb60: 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
cb70: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
cb80: 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
cb90: 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
cba0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
cbb0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
cbc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
cbd0: 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
cbe0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
cbf0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
cc00: 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
cc10: 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
cc20: 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
cc30: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
cc40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
cc50: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
cc60: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
cc70: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
cc80: 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
cc90: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
cca0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
ccb0: 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
ccc0: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
ccd0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
cce0: 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
ccf0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
cd00: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
cd10: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
cd20: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
cd30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
cd40: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
cd50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
cd60: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
cd70: 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
cd80: 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
cd90: 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
cda0: 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
cdb0: 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
cdc0: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
cdd0: 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
cde0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
cdf0: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
ce00: 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
ce10: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
ce20: 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
ce30: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
ce40: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
ce50: 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
ce60: 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
ce70: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
ce80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
ce90: 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
cea0: 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
ceb0: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
cec0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
ced0: 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
cee0: 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
cef0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
cf00: 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
cf10: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
cf20: 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
cf30: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
cf40: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
cf50: 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
cf60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
cf70: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
cf80: 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
cf90: 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
cfa0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
cfb0: 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
cfc0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
cfd0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
cfe0: 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
cff0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
d000: 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
d010: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d020: 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
d030: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
d040: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
d050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d060: 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
d070: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
d080: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d090: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
d0a0: 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
d0b0: 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
d0c0: 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
d0d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d0e0: 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
d0f0: 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
d100: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
d110: 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
d120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d130: 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
d140: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d150: 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
d160: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
d170: 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20  mutexOpen ){.   
d180: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d190: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65  _mutex_held(mute
d1a0: 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71  xOpen) );.    sq
d1b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d1c0: 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
d1d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
d1e0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
d1f0: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
d200: 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
d210: 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
d220: 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
d230: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
d240: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
d250: 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
d260: 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
d270: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
d280: 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
d290: 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
d2a0: 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
d2b0: 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
d2c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
d2d0: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
d2e0: 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
d2f0: 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
d300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
d310: 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65  D_CACHE.  sqlite
d320: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
d330: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ;.  BtShared *pL
d340: 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
d350: 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
d360: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d370: 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
d380: 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65  tex) );.  pMaste
d390: 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
d3a0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
d3b0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
d3c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
d3d0: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
d3e0: 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
d3f0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
d400: 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
d410: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
d420: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
d430: 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
d440: 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
d450: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
d460: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
d470: 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
d480: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
d490: 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
d4a0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
d4b0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
d4c0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
d4d0: 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
d4e0: 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
d4f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
d500: 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
d510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d520: 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
d530: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
d540: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
d550: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
d560: 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
d570: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
d580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
d590: 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
d5a0: 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
d5b0: 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
d5c0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
d5d0: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
d5e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
d5f0: 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
d600: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
d610: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
d620: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
d630: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
d640: 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
d650: 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
d660: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
d670: 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
d680: 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
d690: 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
d6a0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
d6b0: 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
d6c0: 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
d6d0: 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
d6e0: 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a  geSize );.  }.}.
d6f0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
d700: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61  pBt->pTmpSpace a
d710: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
d720: 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d  tic void freeTem
d730: 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
d740: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
d750: 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70  PageFree( pBt->p
d760: 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74  TmpSpace);.  pBt
d770: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
d780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
d790: 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
d7a0: 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
d7b0: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
d7c0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
d7d0: 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
d7e0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
d7f0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
d800: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
d810: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
d820: 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
d830: 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
d840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d850: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
d860: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
d870: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
d880: 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20  er(p);.  pCur = 
d890: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
d8a0: 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20  while( pCur ){. 
d8b0: 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d     BtCursor *pTm
d8c0: 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43  p = pCur;.    pC
d8d0: 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  ur = pCur->pNext
d8e0: 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e  ;.    if( pTmp->
d8f0: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
d900: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
d910: 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29  loseCursor(pTmp)
d920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
d930: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  * Rollback any a
d940: 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
d950: 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68  n and free the h
d960: 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e  andle structure.
d970: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74  .  ** The call t
d980: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  o sqlite3BtreeRo
d990: 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61  llback() drops a
d9a0: 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68  ny table-locks h
d9b0: 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73  eld by.  ** this
d9c0: 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20   handle..  */.  
d9d0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
d9e0: 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74  back(p);.  sqlit
d9f0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
da00: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
da10: 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
da20: 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
da30: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
da40: 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
da50: 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
da60: 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
da70: 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
da80: 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
da90: 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
daa0: 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
dab0: 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
dac0: 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
dad0: 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
dae0: 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
daf0: 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
db00: 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
db10: 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
db20: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
db30: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
db40: 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
db50: 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
db60: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
db70: 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
db80: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
db90: 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
dba0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
dbb0: 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
dbc0: 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
dbd0: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
dbe0: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
dbf0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
dc00: 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
dc10: 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
dc20: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
dc30: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
dc40: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
dc50: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
dc60: 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68  3_free(pBt->pSch
dc70: 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
dc80: 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
dc90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
dca0: 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
dcb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
dcc0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
dcd0: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
dce0: 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
dcf0: 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
dd00: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
dd10: 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
dd20: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
dd30: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
dd40: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
dd50: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
dd60: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
dd70: 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
dd80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
dd90: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
dda0: 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
ddb0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
ddc0: 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
ddd0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
dde0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
ddf0: 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
de00: 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
de10: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
de20: 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
de30: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
de40: 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
de50: 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
de60: 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
de70: 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
de80: 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
de90: 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
dea0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
deb0: 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
dec0: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
ded0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
dee0: 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
def0: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
df00: 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
df10: 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
df20: 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
df30: 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
df40: 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
df50: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
df60: 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
df70: 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
df80: 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
df90: 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
dfa0: 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
dfb0: 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
dfc0: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
dfd0: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
dfe0: 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
dff0: 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
e000: 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
e010: 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
e020: 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
e030: 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
e040: 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
e050: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
e060: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
e070: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
e080: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
e090: 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
e0a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e0b0: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
e0c0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
e0d0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
e0e0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
e0f0: 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
e100: 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
e110: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
e120: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
e130: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e140: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
e150: 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
e160: 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
e170: 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
e180: 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
e190: 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
e1a0: 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
e1b0: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
e1c0: 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
e1d0: 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
e1e0: 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
e1f0: 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
e200: 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
e210: 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
e220: 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
e230: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
e240: 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
e250: 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
e260: 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
e270: 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
e280: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
e290: 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
e2a0: 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
e2b0: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
e2c0: 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
e2d0: 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
e2e0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
e2f0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
e300: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
e310: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
e320: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
e330: 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65  SafetyLevel(Btre
e340: 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  e *p, int level,
e350: 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a   int fullSync){.
e360: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
e370: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
e380: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e390: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
e3a0: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
e3b0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
e3c0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
e3d0: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74  tSafetyLevel(pBt
e3e0: 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c  ->pPager, level,
e3f0: 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71   fullSync);.  sq
e400: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
e410: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
e420: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
e430: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
e440: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
e450: 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
e460: 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
e470: 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
e480: 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
e490: 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
e4a0: 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
e4b0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
e4c0: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
e4d0: 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
e4e0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
e4f0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
e500: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
e510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e520: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
e530: 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
e540: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
e550: 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
e560: 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
e570: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e580: 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
e590: 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
e5a0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
e5b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
e5c0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
e5d0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
e5e0: 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
e5f0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
e600: 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61  ACUUM)./*.** Cha
e610: 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
e620: 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
e630: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
e640: 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
e650: 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
e660: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
e670: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
e680: 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
e690: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
e6a0: 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
e6b0: 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
e6c0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
e6d0: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
e6e0: 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
e6f0: 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
e700: 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
e710: 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
e720: 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
e730: 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
e740: 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
e750: 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
e760: 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
e770: 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
e780: 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
e790: 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
e7a0: 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
e7b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
e7c0: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
e7d0: 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
e7e0: 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
e7f0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
e800: 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
e810: 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
e820: 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
e830: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
e840: 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
e850: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
e860: 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
e870: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
e880: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
e890: 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
e8a0: 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
e8b0: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
e8c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
e8d0: 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67  !=0 then the pag
e8e0: 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61 67 20  eSizeFixed flag 
e8f0: 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74  is set so that t
e900: 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20  he page size.** 
e910: 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d  and autovacuum m
e920: 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65  ode can no longe
e930: 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  r be changed..*/
e940: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
e950: 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
e960: 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
e970: 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
e980: 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20  e, int iFix){.  
e990: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e9a0: 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
e9b0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
e9c0: 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
e9d0: 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
e9e0: 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
e9f0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
ea00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
ea10: 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20  SizeFixed ){.   
ea20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
ea30: 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
ea40: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
ea50: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
ea60: 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
ea70: 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
ea80: 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
ea90: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
eaa0: 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
eab0: 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
eac0: 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
ead0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
eae0: 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
eaf0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
eb00: 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
eb10: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
eb20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
eb30: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
eb40: 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
eb50: 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65  ert( !pBt->pPage
eb60: 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73  1 && !pBt->pCurs
eb70: 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
eb80: 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
eb90: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
eba0: 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
ebb0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ebc0: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
ebd0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
ebe0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
ebf0: 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c    }.  pBt->usabl
ec00: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
ec10: 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
ec20: 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
ec30: 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  x ) pBt->pageSiz
ec40: 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71  eFixed = 1;.  sq
ec50: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
ec60: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
ec70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ec80: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
ec90: 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
eca0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
ecb0: 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
ecc0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
ecd0: 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
ece0: 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Size;.}../*.** R
ecf0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
ed00: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
ed10: 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
ed20: 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
ed30: 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
ed40: 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
ed50: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
ed60: 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
ed70: 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
ed80: 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
ed90: 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  nsions..*/.int s
eda0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
edb0: 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
edc0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
edd0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
ede0: 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
edf0: 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
ee00: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
ee10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
ee20: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
ee30: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
ee40: 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
ee50: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
ee60: 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
ee70: 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
ee80: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
ee90: 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
eea0: 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
eeb0: 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
eec0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
eed0: 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
eee0: 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
eef0: 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
ef00: 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
ef10: 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
ef20: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
ef30: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
ef40: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
ef50: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
ef60: 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
ef70: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
ef80: 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
ef90: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
efa0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69  eturn n;.}.#endi
efb0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
efc0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
efd0: 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
efe0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
eff0: 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
f000: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
f010: 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
f020: 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
f030: 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
f040: 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
f050: 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
f060: 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
f070: 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
f080: 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
f090: 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
f0a0: 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
f0b0: 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
f0c0: 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
f0d0: 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
f0e0: 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
f0f0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
f100: 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
f110: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
f120: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
f130: 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
f140: 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
f150: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f160: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
f170: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
f180: 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
f190: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
f1a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f1b0: 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
f1c0: 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
f1d0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
f1e0: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
f1f0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
f200: 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
f210: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
f220: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
f230: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
f240: 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
f250: 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
f260: 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
f270: 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
f280: 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
f290: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
f2a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
f2b0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
f2c0: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
f2d0: 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
f2e0: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
f2f0: 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
f300: 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
f310: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
f320: 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
f330: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
f340: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
f350: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
f360: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f370: 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
f380: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
f390: 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
f3a0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
f3b0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
f3c0: 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
f3d0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
f3e0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
f3f0: 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
f400: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
f410: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
f420: 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
f430: 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
f440: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
f450: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
f460: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
f470: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
f480: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
f490: 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
f4a0: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
f4b0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
f4c0: 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
f4d0: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
f4e0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
f4f0: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
f500: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
f510: 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
f520: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
f530: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
f540: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
f550: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
f560: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
f570: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
f580: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
f590: 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
f5a0: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
f5b0: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
f5c0: 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
f5d0: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
f5e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
f5f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
f600: 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
f610: 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73  int nPage;..  as
f620: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f630: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
f640: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
f650: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
f660: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
f670: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
f680: 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
f690: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
f6a0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
f6b0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
f6c0: 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
f6d0: 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
f6e0: 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
f6f0: 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
f700: 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
f710: 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  le. .  */.  rc =
f720: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
f730: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
f740: 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69  er, &nPage);.  i
f750: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f760: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   ){.    goto pag
f770: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
f780: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67    }else if( nPag
f790: 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  e>0 ){.    int p
f7a0: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  ageSize;.    int
f7b0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
f7c0: 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
f7d0: 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
f7e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
f7f0: 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63  DB;.    if( memc
f800: 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
f810: 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
f820: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
f830: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
f840: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
f850: 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
f860: 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79     pBt->readOnly
f870: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
f880: 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
f890: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
f8a0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
f8b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
f8c0: 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64  he maximum embed
f8d0: 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
f8e0: 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25  t be exactly 25%
f8f0: 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d  .  And the minim
f900: 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64  um.    ** embedd
f910: 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
f920: 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f   be 12.5% for bo
f930: 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64  th leaf-data and
f940: 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a   non-leaf-data..
f950: 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
f960: 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
f970: 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
f980: 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
f990: 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
f9a0: 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
f9b0: 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
f9c0: 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
f9d0: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
f9e0: 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
f9f0: 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
fa00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
fa10: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
fa20: 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a     }.    pageSiz
fa30: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61  e = get2byte(&pa
fa40: 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  ge1[16]);.    if
fa50: 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
fa60: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20  pageSize)!=0 || 
fa70: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a  pageSize<512 ||.
fa80: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
fa90: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32  MAX_PAGE_SIZE<32
faa0: 37 36 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e  768 && pageSize>
fab0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
fac0: 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20  SIZE).    ){.   
fad0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
fae0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
faf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
fb00: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
fb10: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
fb20: 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
fb30: 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
fb40: 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e   pageSize!=pBt->
fb50: 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
fb60: 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
fb70: 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
fb80: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
fb90: 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
fba0: 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
fbb0: 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
fbc0: 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
fbd0: 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
fbe0: 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
fbf0: 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
fc00: 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
fc10: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
fc20: 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
fc30: 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
fc40: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
fc50: 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
fc60: 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
fc70: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
fc80: 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
fc90: 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
fca0: 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
fcb0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
fcc0: 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
fcd0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
fce0: 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69   = (u16)usableSi
fcf0: 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
fd00: 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
fd10: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
fd20: 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
fd30: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
fd40: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
fd50: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
fd60: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
fd70: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
fd80: 20 29 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e   ) goto page1_in
fd90: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
fda0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fdb0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
fdc0: 20 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20   usableSize<500 
fdd0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
fde0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
fdf0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
fe00: 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
fe10: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
fe20: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
fe30: 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b  (u16)usableSize;
fe40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fe50: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
fe60: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
fe70: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
fe80: 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
fe90: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
fea0: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
feb0: 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
fec0: 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
fed0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
fee0: 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
fef0: 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
ff00: 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
ff10: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
ff20: 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
ff30: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
ff40: 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
ff50: 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
ff60: 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
ff70: 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
ff80: 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
ff90: 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
ffa0: 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
ffb0: 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
ffc0: 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
ffd0: 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
ffe0: 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
fff0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
10000 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
10010 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
10020 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
10030 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
10040 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
10050 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
10060 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
10070 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
10080 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
10090 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
100a0 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20  oiner, a header 
100b0 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
100c0 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
100d0 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
100e0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
100f0 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
10100 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
10110 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
10120 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
10130 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  maxLocal = (pBt-
10140 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
10150 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  64/255 - 23;.  p
10160 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
10170 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
10180 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
10190 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
101a0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
101b0 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d  e - 35;.  pBt->m
101c0 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75  inLeaf = (pBt->u
101d0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
101e0 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73  /255 - 23;.  ass
101f0 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
10200 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
10210 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
10220 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
10230 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
10240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
10250 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
10260 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
10270 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
10280 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
10290 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
102a0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
102b0 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
102c0 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
102d0 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
102e0 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
102f0 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
10300 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
10310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
10320 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
10330 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
10340 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10350 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
10360 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
10370 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b  dsMutex(pRef) );
10380 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54  .  if( pRef->inT
10390 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
103a0 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61   ){.    u8 inTra
103b0 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d  nsaction = pRef-
103c0 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
103d0 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e  ion;.    btreeIn
103e0 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
103f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
10400 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
10410 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65  Ref, 0);.    pRe
10420 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
10430 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61  ction = inTransa
10440 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d  ction;.    pRef-
10450 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
10460 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72  _NONE;.    if( r
10470 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10480 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d        pRef->pBt-
10490 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
104a0 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65  .    }.    btree
104b0 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
104c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
104d0 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a  ;.}.       ../*.
104e0 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
104f0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
10500 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
10510 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
10520 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
10530 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
10540 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
10550 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
10560 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
10570 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
10580 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
10590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
105a0 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
105b0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
105c0 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
105d0 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
105e0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75  there are any ou
105f0 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
10600 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10610 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
10620 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
10630 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
10640 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
10650 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
10660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10670 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
10680 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
10690 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
106a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
106b0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
106c0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
106d0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
106e0 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43  _NONE && pBt->pC
106f0 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d  ursor==0 && pBt-
10700 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
10710 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
10720 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
10730 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20  pPager)>=1 ){.  
10740 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
10750 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
10760 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
10770 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29  age(pBt->pPage1)
10780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
10790 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d  >pPage1 = 0;.  }
107a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
107b0 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
107c0 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
107d0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
107e0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  f the.** file..*
107f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
10800 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
10810 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
10820 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
10830 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
10840 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
10850 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  nPage;..  assert
10860 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10870 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
10880 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
10890 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
108a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
108b0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
108c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50  =SQLITE_OK || nP
108d0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
108e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
108f0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
10900 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
10910 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
10920 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
10930 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
10940 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
10950 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
10960 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
10970 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
10980 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
10990 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
109a0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
109b0 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
109c0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
109d0 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67  ta[16], pBt->pag
109e0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31  eSize);.  data[1
109f0 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
10a00 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
10a10 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
10a20 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
10a30 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
10a40 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
10a50 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
10a60 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
10a70 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
10a80 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
10a90 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
10aa0 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
10ab0 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
10ac0 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
10ad0 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
10ae0 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
10af0 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
10b00 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
10b10 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53   );.  pBt->pageS
10b20 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
10b30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10b40 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
10b50 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
10b60 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
10b70 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
10b80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
10b90 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
10ba0 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
10bb0 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
10bc0 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
10bd0 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
10be0 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
10bf0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
10c00 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
10c10 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  um);.#endif.  re
10c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10c30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
10c40 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
10c50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
10c60 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10c70 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
10c80 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
10c90 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
10ca0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
10cb0 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
10cc0 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
10cd0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
10ce0 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
10cf0 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
10d00 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
10d10 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
10d20 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
10d30 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
10d40 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
10d50 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
10d60 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
10d70 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
10d80 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
10d90 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
10da0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
10db0 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
10dc0 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
10dd0 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
10de0 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
10df0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
10e00 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10e10 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
10e20 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
10e30 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
10e40 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
10e50 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
10e60 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
10e70 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
10e80 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
10e90 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
10ea0 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
10eb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10ec0 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
10ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10ee0 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
10ef0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
10f00 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
10f10 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
10f20 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
10f30 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
10f40 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
10f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10f60 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
10f70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
10f80 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
10f90 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
10fa0 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
10fb0 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
10fc0 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
10fd0 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
10fe0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
10ff0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
11000 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
11010 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
11020 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
11030 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
11040 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
11050 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
11060 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
11070 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
11080 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
11090 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
110a0 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
110b0 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
110c0 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
110d0 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
110e0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
110f0 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
11100 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
11110 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
11120 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
11130 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
11140 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
11150 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
11160 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
11170 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
11180 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
11190 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
111a0 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
111b0 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
111c0 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
111d0 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
111e0 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
111f0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
11200 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
11210 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
11220 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
11230 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
11240 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
11250 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
11260 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
11270 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
11280 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
11290 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
112a0 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
112b0 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
112c0 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
112d0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
112e0 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
112f0 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73  int wrflag){.  s
11300 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
11310 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
11320 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11330 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11340 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
11350 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
11360 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
11370 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
11380 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
11390 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
113a0 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
113b0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
113c0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
113d0 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
113e0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
113f0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
11400 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
11410 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
11420 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
11430 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
11440 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
11450 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
11460 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
11470 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
11480 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
11490 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
114a0 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
114b0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
114c0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
114d0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
114e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
114f0 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ONLY;.    goto t
11500 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
11510 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11520 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
11530 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  E.  /* If anothe
11540 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
11550 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
11560 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
11570 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
11580 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
11590 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
115a0 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
115b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
115c0 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
115d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
115e0 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  CKED..  */.  if(
115f0 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d   (wrflag && pBt-
11600 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11610 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20  TRANS_WRITE) || 
11620 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29  pBt->isPending )
11630 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70  {.    pBlock = p
11640 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
11650 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66  .  }else if( wrf
11660 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
11670 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
11680 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
11690 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
116a0 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
116b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
116c0 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
116d0 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
116e0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
116f0 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  db;.        brea
11700 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
11710 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63  .  }.  if( pBloc
11720 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
11730 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
11740 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
11750 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
11760 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
11770 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ACHE;.    goto t
11780 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
11790 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20 7b 0a 20  #endif..  do {. 
117a0 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
117b0 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
117c0 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
117d0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
117e0 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
117f0 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
11800 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
11810 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
11820 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
11830 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
11840 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
11850 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
11860 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
11870 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
11880 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
11890 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
118a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
118b0 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
118c0 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
118d0 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
118e0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
118f0 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
11900 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
11910 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
11920 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
11930 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
11940 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
11950 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
11960 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
11970 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
11980 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11990 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
119a0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72        if( pBt->r
119b0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
119c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
119d0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
119e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
119f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
11a00 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
11a10 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
11a20 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
11a30 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
11a40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
11a60 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
11a70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
11a80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
11a90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11aa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
11ab0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
11ac0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
11ad0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
11ae0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
11af0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11b00 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
11b10 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
11b20 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
11b30 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
11b40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11b50 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
11b60 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
11b70 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
11b80 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
11b90 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
11ba0 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
11bb0 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
11bc0 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
11bd0 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
11be0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
11bf0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
11c00 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
11c10 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ns;.    }.#ifnde
11c20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
11c30 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69  ARED_CACHE.    i
11c40 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
11c50 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
11c60 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
11c70 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
11c80 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   p;.      pBt->i
11c90 73 45 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38  sExclusive = (u8
11ca0 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20  )(wrflag>1);.   
11cb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a   }.#endif.  }...
11cc0 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
11cd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11ce0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
11cf0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
11d00 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
11d10 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
11d20 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
11d30 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
11d40 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
11d50 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
11d60 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
11d70 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
11d80 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
11d90 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
11da0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
11db0 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
11dc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
11dd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
11de0 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
11df0 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
11e00 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
11e10 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
11e20 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
11e30 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
11e50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11e60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
11e70 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
11e80 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
11e90 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
11ea0 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
11eb0 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
11ec0 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
11ed0 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
11ee0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
11ef0 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
11f00 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
11f10 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
11f20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
11f30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
11f40 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
11f50 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
11f60 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f80 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
11f90 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
11fa0 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
11fd0 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
11fe0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
12010 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
12020 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
12030 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49  e->pBt;.  u8 isI
12040 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
12050 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20  >isInit;.  Pgno 
12060 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
12070 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
12080 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12090 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
120a0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
120b0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
120c0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
120d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
120e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
120f0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
12100 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
12110 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
12120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
12130 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
12140 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
12150 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
12160 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
12170 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
12180 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
12190 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
121a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  .      goto set_
121b0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
121c0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
121d0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
121e0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
121f0 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
12200 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
12210 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
12220 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
12230 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
12240 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
12250 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
12260 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
12270 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  maps_out;.    }.
12280 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
12290 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
122a0 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
122b0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
122c0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
122d0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
122e0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
122f0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
12300 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
12310 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  no);.  }..set_ch
12320 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
12330 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
12340 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
12350 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12360 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
12370 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68 20 69  n pPage, which i
12380 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
12390 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 2c  be a btree page,
123a0 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77   not an overflow
123b0 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70  .** page, is a p
123c0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
123d0 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69  From. Modify thi
123e0 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61  s pointer so tha
123f0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
12400 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  * iTo. Parameter
12410 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
12420 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
12430 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66  nter to be modif
12440 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c  ied, as .** foll
12450 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
12460 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
12470 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
12480 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
12490 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
124a0 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
124b0 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
124c0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
124d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
124e0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
124f0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
12500 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
12510 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
12530 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
12540 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
12550 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
12560 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
12570 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
12580 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
12590 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
125a0 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
125d0 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
125e0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
125f0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
12600 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
12610 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
12620 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
12630 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12640 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
12650 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
12660 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12670 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
12680 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
12690 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
126a0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
126b0 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
126c0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
126d0 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
126e0 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
126f0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
12700 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
12710 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
12720 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
12730 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12740 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
12750 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
12760 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
12770 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
12780 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
12790 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
127a0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
127b0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
127c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
127d0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
127e0 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
127f0 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
12800 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
12810 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
12820 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
12830 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
12840 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
12850 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
12860 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
12870 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73   info;.        s
12880 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
12890 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
128a0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
128b0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
128c0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
128d0 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
128e0 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
128f0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
12900 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
12910 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
12920 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
12930 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
12940 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
12960 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12970 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
12980 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
12990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
129a0 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
129b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
129c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
129d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
129e0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
129f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
12a00 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
12a10 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
12a20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
12a30 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
12a40 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
12a50 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
12a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12a70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
12a80 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
12a90 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
12aa0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
12ab0 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
12ac0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
12ad0 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
12ae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
12af0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
12b00 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
12b10 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
12b20 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
12b30 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
12b40 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
12b50 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
12b60 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
12b70 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  valid..*/.static
12b80 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
12b90 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
12ba0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
12bb0 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
12bc0 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
12bd0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
12be0 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
12bf0 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
12c00 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12c10 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
12c20 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
12c30 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
12c40 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
12c50 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
12c60 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
12c70 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
12c80 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
12c90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
12ca0 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
12cb0 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
12cc0 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20  nt isCommit.){. 
12cd0 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
12ce0 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
12cf0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
12d00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
12d10 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
12d20 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
12d30 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
12d40 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
12d50 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
12d60 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
12d70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
12d80 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
12d90 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
12da0 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
12db0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
12dc0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
12dd0 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
12de0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12df0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
12e00 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
12e10 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
12e20 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
12e30 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
12e40 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
12e50 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
12e60 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
12e70 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
12e80 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
12e90 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
12ea0 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
12eb0 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
12ec0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
12ed0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
12ee0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
12ef0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
12f00 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
12f10 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
12f20 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
12f30 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
12f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12f60 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
12f70 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
12f80 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
12f90 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
12fa0 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
12fb0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
12fc0 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
12fd0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
12fe0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
12ff0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
13000 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
13010 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
13020 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
13030 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
13040 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
13050 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
13060 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
13070 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
13080 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
13090 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
130a0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
130b0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
130c0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
130d0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
130e0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
130f0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
13100 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
13110 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
13120 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
13130 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
13140 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
13150 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
13160 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
13170 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
13190 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
131a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
131b0 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
131c0 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
131d0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
131e0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
131f0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
13200 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
13210 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
13220 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a  W2, iFreePage);.
13230 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13250 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13260 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13270 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
13280 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
13290 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
132a0 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
132b0 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
132c0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
132d0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
132e0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
132f0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
13300 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
13310 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
13320 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
13330 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
13340 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
13350 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
13360 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
13370 20 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 20 20 72 65  E_OK ){.      re
13390 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
133a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
133b0 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
133c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
133d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
133e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
133f0 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
13400 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
13410 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
13420 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
13430 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
13440 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
13450 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
13460 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
13470 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
13480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13490 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
134a0 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
134b0 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
134c0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
134d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
134e0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
134f0 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
13500 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
13510 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
13520 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
13530 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
13540 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
13550 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
13560 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
13570 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
13580 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
13590 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
135a0 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e  ssful,.** return
135b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
135c0 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
135d0 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
135e0 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74  fore no.** point
135f0 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   in calling this
13600 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
13610 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
13620 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  DONE..**.** More
13630 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69   specificly, thi
13640 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
13650 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
13660 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ze the .** datab
13670 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ase so that the 
13680 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
13690 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
136a0 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20  in use.** is no 
136b0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
136c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e  *.** If the nFin
136d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
136e0 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c  n-zero, the impl
136f0 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d  ementation assum
13700 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  es.** that the c
13710 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
13720 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
13730 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a  umStep() until.*
13740 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  * it returns SQL
13750 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65  ITE_DONE or an e
13760 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e  rror, and that n
13770 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  Fin is the.** nu
13780 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
13790 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
137a0 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74  will contain aft
137b0 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63  er this .** proc
137c0 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e  ess is complete.
137d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
137e0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
137f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
13800 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
13810 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  stPg){.  Pgno nF
13820 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
13830 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13840 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
13850 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
13860 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13870 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
13880 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
13890 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e  ssert( iLastPg>n
138a0 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50  Fin );..  if( !P
138b0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
138c0 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
138d0 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
138e0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
138f0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
13900 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
13910 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
13920 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67     nFreeList = g
13930 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
13940 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
13950 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c  ;.    if( nFreeL
13960 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
13970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
13980 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
13990 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
139a0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
139b0 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
139c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
139d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
139e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
139f0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
13a00 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
13a10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
13a20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
13a30 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
13a40 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
13a50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
13a60 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29     if( nFin==0 )
13a70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
13a80 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
13a90 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
13aa0 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
13ab0 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
13ac0 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69      ** if nFin i
13ad0 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
13ae0 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
13af0 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
13b00 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
13b10 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
13b20 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
13b30 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
13b40 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
13b50 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
13b60 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
13b70 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
13b80 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
13b90 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
13ba0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
13bb0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
13bc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
13bd0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
13be0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
13bf0 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
13c00 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
13c10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
13c30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
13c40 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
13c50 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
13c60 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
13c70 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
13c80 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
13c90 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
13ca0 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
13cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
13cc0 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
13cd0 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
13ce0 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
13cf0 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20  ge *pLastPg;..  
13d00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13d10 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
13d20 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
13d30 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
13d40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13d50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
13d60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
13d70 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e        /* If nFin
13d80 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
13d90 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
13da0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
13db0 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
13dc0 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
13dd0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
13de0 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
13df0 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
13e00 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
13e10 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
13e20 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72  d, if nFin is gr
13e30 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
13e40 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
13e50 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
13e60 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
13e70 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
13e80 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
13e90 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
13ea0 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
13eb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13ec0 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
13ed0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
13ee0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
13ef0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
13f00 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
13f10 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  reePg, 0, 0);.  
13f20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13f40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
13f50 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
13f60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13f70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13f80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
13f90 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
13fa0 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26  hile( nFin!=0 &&
13fb0 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
13fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
13fd0 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
13fe0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
13ff0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14000 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70  Write(pLastPg->p
14010 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
14020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14030 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14040 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
14050 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
14060 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
14070 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a  eePg, nFin!=0);.
14080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
14090 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
140a0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
140b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
140c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
140d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
140e0 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d    }..  if( nFin=
140f0 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50  =0 ){.    iLastP
14100 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g--;.    while( 
14110 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
14120 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c  _BYTE_PAGE(pBt)|
14130 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  |PTRMAP_ISPAGE(p
14140 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a  Bt, iLastPg) ){.
14150 20 20 20 20 20 20 69 66 28 20 50 54 52 4d 41 50        if( PTRMAP
14160 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
14170 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20  stPg) ){.       
14180 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20   MemPage *pPg;. 
14190 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
141a0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
141b0 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
141c0 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
141d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
141e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
141f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14210 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
14220 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
14230 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
14240 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
14250 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
14260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14270 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
14280 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14290 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50    }.      iLastP
142a0 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g--;.    }.    s
142b0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
142c0 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
142d0 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a  ager, iLastPg);.
142e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
142f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14300 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
14310 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
14320 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
14330 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
14340 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
14350 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
14360 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
14370 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
14380 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
14390 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
143a0 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
143b0 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
143c0 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
143d0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
143e0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
143f0 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
14400 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
14410 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
14420 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14430 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
14440 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
14450 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
14460 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
14470 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
14480 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
14490 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
144a0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
144b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
144c0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
144d0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
144e0 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
144f0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
14500 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
14510 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
14520 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
14530 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
14540 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
14550 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
14560 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
14570 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20  uumStep(pBt, 0, 
14580 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
14590 42 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Bt));.  }.  sqli
145a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
145b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
145c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
145d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
145e0 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
145f0 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
14600 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
14610 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72   is commited for
14620 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
14630 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
14640 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
14650 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
14660 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
14670 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
14680 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
14690 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
146a0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
146b0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
146c0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
146d0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
146e0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
146f0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
14700 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
14710 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
14720 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
14730 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
14740 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
14750 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
14760 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14770 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
14780 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
14790 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
147a0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
147b0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
147c0 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  ger) );..  asser
147d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
147e0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
147f0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
14800 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
14810 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
14820 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
14830 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
14840 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
14850 20 50 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20 20   Pgno nFin;.    
14860 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20  Pgno nFree;.    
14870 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20  Pgno nPtrmap;.  
14880 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20 20    Pgno iFree;.  
14890 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a    const int pgsz
148a0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
148b0 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  ;.    Pgno nOrig
148c0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
148d0 74 28 70 42 74 29 3b 0a 0a 20 20 20 20 69 66 28  t(pBt);..    if(
148e0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
148f0 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f  Bt, nOrig) || nO
14900 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rig==PENDING_BYT
14910 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
14920 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
14930 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72  t possible to cr
14940 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
14950 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69  for which the fi
14960 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a  nal page.      *
14970 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f  * is either a po
14980 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f  inter-map page o
14990 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
149a0 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a  te page. If one.
149b0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f        ** is enco
149c0 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e  untered, this in
149d0 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69  dicates corrupti
149e0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
149f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14a00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14a10 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20     }..    nFree 
14a20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
14a30 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
14a40 36 5d 29 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70  6]);.    nPtrmap
14a50 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
14a60 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
14a70 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35  t, nOrig)+pgsz/5
14a80 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20  )/(pgsz/5);.    
14a90 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
14aa0 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
14ab0 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45      if( nOrig>PE
14ac0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
14ad0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
14ae0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
14af0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69  Bt) ){.      nFi
14b00 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n--;.    }.    w
14b10 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
14b20 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
14b30 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
14b40 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
14b50 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
14b60 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
14b70 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
14b80 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
14b90 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
14ba0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
14bb0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
14bc0 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a  , nFin, iFree);.
14bd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
14be0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
14bf0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
14c00 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
14c10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14c20 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _OK;.      rc = 
14c30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
14c40 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
14c50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
14c60 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
14c70 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
14c80 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
14c90 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
14ca0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
14cb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
14cc0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
14cd0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46  (pBt->pPager, nF
14ce0 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
14cf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14d00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14d10 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
14d20 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
14d30 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
14d40 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
14d50 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
14d60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14d70 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  }..#endif /* ifn
14d80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14d90 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f  AUTOVACUUM */../
14da0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14db0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
14dc0 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
14dd0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
14de0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
14df0 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
14e00 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
14e10 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
14e20 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
14e30 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
14e40 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
14e50 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
14e60 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
14e70 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
14e80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
14e90 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
14ea0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
14eb0 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
14ec0 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
14ed0 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
14ee0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
14ef0 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
14f00 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
14f10 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
14f20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
14f30 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
14f40 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
14f50 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
14f60 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
14f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
14f80 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
14f90 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
14fa0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
14fb0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
14fc0 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
14fd0 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
14fe0 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
14ff0 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
15000 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
15010 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
15020 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
15030 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
15040 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
15050 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
15060 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
15070 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
15080 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
15090 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
150a0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
150b0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
150c0 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
150d0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
150e0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
150f0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
15100 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
15110 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
15120 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
15130 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
15140 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
15150 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
15160 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
15170 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
15180 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
15190 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
151a0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
151b0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
151c0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
151d0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
151e0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
151f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
15200 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
15210 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
15220 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
15230 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
15240 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
15250 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
15260 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
15270 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
15280 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
15290 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
152a0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
152b0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
152c0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
152d0 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
152e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
152f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15300 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
15310 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
15320 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
15330 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15340 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
15350 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
15360 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
15370 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15380 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
15390 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
153a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
153b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
153c0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
153d0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
153e0 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
153f0 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
15400 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15410 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15420 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
15430 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
15440 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
15450 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
15460 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
15470 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
15480 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
15490 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
154a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
154b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
154c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
154d0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
154e0 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
154f0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
15500 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
15510 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
15520 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
15530 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
15540 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
15550 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
15560 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
15570 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
15580 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
15590 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
155a0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
155b0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
155c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
155d0 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
155e0 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
155f0 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
15600 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
15610 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
15620 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
15630 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
15640 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
15650 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
15660 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
15670 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
15680 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
15690 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
156a0 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
156b0 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
156c0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
156d0 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
156e0 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
156f0 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
15700 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54  p locks..**.** T
15710 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
15720 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
15730 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15740 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
15750 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
15760 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
15770 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
15780 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
15790 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
157a0 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
157b0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
157c0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
157d0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
157e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
157f0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
15800 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
15810 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
15820 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
15830 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
15840 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
15850 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
15860 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
15870 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
15880 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
15890 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
158a0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
158b0 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
158c0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
158d0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
158e0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
158f0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
15900 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
15910 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
15920 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
15930 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15940 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15950 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15960 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15970 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15980 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69      }.    pBt->i
15990 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
159a0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
159b0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
159c0 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20  le has any kind 
159d0 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
159e0 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
159f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
15a00 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65   ** count of the
15a10 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
15a20 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
15a30 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  n count reaches 
15a40 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20  0, set.  ** the 
15a50 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
15a60 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
15a70 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
15a80 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77  sed() call below
15a90 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63  .  ** will unloc
15aa0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  k the pager..  *
15ab0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
15ac0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
15ad0 7b 0a 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68  {.    clearAllSh
15ae0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
15af0 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 42 74 2d  cks(p);.    pBt-
15b00 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
15b10 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
15b20 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
15b30 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
15b40 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
15b50 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
15b60 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
15b70 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
15b80 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
15b90 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
15ba0 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ck.  ** the page
15bb0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
15bc0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
15bd0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
15be0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
15bf0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
15c00 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70 2d  ntent(pBt);.  p-
15c10 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
15c20 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42  _NONE;.  unlockB
15c30 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
15c40 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  );..  btreeInteg
15c50 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
15c60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15c70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15c80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
15c90 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
15ca0 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
15cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
15cc0 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
15cd0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
15ce0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15cf0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
15d00 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
15d10 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
15d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15d30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15d40 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
15d50 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73  eTwo(p);.  }.  s
15d60 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15d70 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
15d80 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
15d90 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
15da0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
15db0 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
15dc0 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
15dd0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
15de0 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
15df0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
15e00 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
15e10 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
15e20 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
15e30 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
15e40 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
15e50 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
15e60 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
15e70 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
15e80 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
15e90 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
15ea0 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
15eb0 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
15ec0 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
15ed0 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
15ee0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
15ef0 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
15f00 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
15f10 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
15f20 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
15f30 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
15f40 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
15f50 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
15f60 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
15f70 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
15f80 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
15f90 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
15fa0 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
15fb0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
15fc0 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
15fd0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
15fe0 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
15ff0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
16000 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16010 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
16020 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
16030 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
16040 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
16050 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
16060 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
16070 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
16080 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
16090 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
160a0 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
160b0 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
160c0 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
160d0 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
160e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
160f0 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
16100 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
16110 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
16120 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
16130 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
16140 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
16150 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
16160 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
16170 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
16180 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
16190 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
161a0 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
161b0 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
161c0 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
161d0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
161e0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
161f0 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
16200 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
16210 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
16220 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
16230 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
16240 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
16250 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
16260 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
16270 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
16280 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
16290 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
162a0 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
162b0 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
162c0 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
162d0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
162e0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
162f0 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
16300 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
16310 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
16320 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
16330 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
16340 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
16350 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
16360 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b  >skip = errCode;
16370 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16380 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  =p->iPage; i++){
16390 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
163a0 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29  ge(p->apPage[i])
163b0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67  ;.      p->apPag
163c0 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
163d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
163e0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
163f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
16400 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
16410 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
16420 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
16430 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
16440 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
16450 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
16460 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
16470 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
16480 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
16490 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
164a0 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
164b0 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
164c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
164d0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
164e0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
164f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
16500 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
16510 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
16520 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
16530 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
16540 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
16550 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
16560 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
16570 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
16580 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16590 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
165a0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
165b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
165c0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
165d0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
165e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
165f0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
16600 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16610 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
16620 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
16630 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
16640 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
16650 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
16660 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  .    ** trying t
16670 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f  o save cursor po
16680 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73  sitions. If this
16690 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   is an automatic
166a0 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20   rollback (as.  
166b0 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20    ** the result 
166c0 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  of a constraint,
166d0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
166e0 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74  e or IO error) t
166f0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
16700 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74  cache may be int
16710 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
16720 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69  tent (not contai
16730 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73  n valid trees) s
16740 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e  o.    ** we cann
16750 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  ot simply return
16760 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68   the error to th
16770 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61  e caller. Instea
16780 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a  d, abort .    **
16790 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61   all queries tha
167a0 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61  t may be using a
167b0 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ny of the cursor
167c0 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f  s that failed to
167d0 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   save..    */.  
167e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
167f0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
16800 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  rc);.  }.#endif.
16810 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
16820 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
16830 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
16840 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
16850 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
16860 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
16870 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
16880 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
16890 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
168a0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
168b0 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
168c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
168d0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
168e0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
168f0 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
16900 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
16910 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
16920 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
16930 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  l sqlite3BtreeGe
16940 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
16950 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
16960 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
16970 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
16980 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
16990 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
169a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
169b0 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
169c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
169d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
169e0 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
169f0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
16a00 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
16a10 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
16a20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
16a30 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
16a40 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
16a50 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
16a60 0a 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61  .    clearAllSha
16a70 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
16a80 6b 73 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  ks(p);.    asser
16a90 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
16aa0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42  tion>0 );.    pB
16ab0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
16ac0 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
16ad0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
16ae0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
16af0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
16b00 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
16b10 20 20 7d 0a 0a 20 20 62 74 72 65 65 43 6c 65 61    }..  btreeClea
16b20 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
16b30 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  ;.  p->inTrans =
16b40 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75   TRANS_NONE;.  u
16b50 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
16b60 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65  ed(pBt);..  btre
16b70 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
16b80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16b90 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16ba0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
16bb0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
16bc0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
16bd0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
16be0 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c  n can can be rol
16bf0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
16c00 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
16c10 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
16c20 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
16c30 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
16c40 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
16c50 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
16c60 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
16c70 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
16c80 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
16c90 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
16ca0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
16cb0 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
16cc0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
16cd0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
16ce0 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
16cf0 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
16d00 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
16d10 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
16d20 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
16d30 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
16d40 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
16d50 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
16d60 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
16d70 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
16d80 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
16d90 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
16da0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
16db0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
16dc0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
16dd0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
16de0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
16df0 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
16e00 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
16e10 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
16e20 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
16e30 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
16e40 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
16e50 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
16e60 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
16e70 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
16e80 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
16e90 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
16ea0 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
16eb0 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
16ec0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
16ed0 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
16ee0 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
16ef0 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
16f00 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
16f10 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
16f20 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
16f30 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
16f40 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
16f50 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
16f60 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
16f70 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
16f80 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
16f90 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
16fa0 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
16fb0 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
16fc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
16fd0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16fe0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
16ff0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
17000 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
17010 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
17020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
17030 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  t->readOnly==0 )
17040 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
17050 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
17060 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
17070 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
17080 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  nt );.  if( NEVE
17090 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  R(p->inTrans!=TR
170a0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42 74  ANS_WRITE || pBt
170b0 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
170c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
170d0 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65  NTERNAL;.  }else
170e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
170f0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
17100 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
17110 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20 70  .    /* At the p
17120 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
17130 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
17140 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
17150 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61  nt with.    ** a
17160 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
17170 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
17180 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
17190 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 20  icitly using.   
171a0 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
171b0 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
171c0 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
171d0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
171e0 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 73  ny.    ** such s
171f0 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
17200 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
17210 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
17220 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
17230 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
17240 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
17250 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
17260 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
17270 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
17280 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17290 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
172a0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
172b0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
172c0 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
172d0 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
172e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
172f0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
17300 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
17310 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
17320 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
17330 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
17340 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
17350 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
17360 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
17370 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
17380 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
17390 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
173a0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
173b0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
173c0 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
173d0 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
173e0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
173f0 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
17400 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
17410 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
17420 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
17430 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
17440 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
17450 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
17460 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
17470 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
17480 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
17490 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
174a0 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
174b0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
174c0 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
174d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
174e0 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
174f0 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
17500 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
17510 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17520 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
17530 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
17540 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
17550 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17560 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
17570 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
17580 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
17590 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
175a0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
175b0 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
175c0 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
175d0 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
175e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
175f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17600 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
17610 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
17620 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
17630 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
17640 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
17650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17660 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
17670 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
17680 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
17690 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
176a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
176b0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
176c0 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
176d0 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
176e0 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
176f0 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54  ge.** iTable.  T
17700 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72  he act of acquir
17710 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74  ing a cursor get
17720 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
17730 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73   .** the databas
17740 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
17750 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
17760 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
17770 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
17780 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
17790 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
177a0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
177b0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
177c0 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
177d0 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
177e0 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
177f0 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
17800 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
17810 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
17820 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
17830 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
17840 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
17850 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
17860 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
17870 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
17880 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
17890 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
178a0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
178b0 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
178c0 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
178d0 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
178e0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
178f0 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
17900 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
17910 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
17920 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
17930 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
17940 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
17950 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
17960 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
17970 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
17980 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
17990 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
179a0 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
179b0 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
179c0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
179d0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
179e0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
179f0 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
17a00 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
17a10 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
17a20 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
17a30 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
17a40 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
17a50 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
17a60 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
17a70 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
17a80 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
17a90 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
17aa0 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
17ab0 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
17ac0 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
17ad0 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
17ae0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
17af0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
17b00 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
17b10 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29  treeCursorSize()
17b20 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
17b30 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20   .** pointed to 
17b40 62 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65  by pCur have bee
17b50 6e 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20  n zeroed by the 
17b60 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
17b70 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
17b80 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17bb0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
17bc0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
17bf0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
17c00 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
17c10 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17c30 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
17c40 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
17c50 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
17c60 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
17c70 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
17c80 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
17c90 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
17ca0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
17cd0 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
17ce0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
17cf0 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74  Pgno nPage;.  Bt
17d00 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17d10 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
17d20 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
17d30 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
17d40 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
17d50 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
17d60 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ;.  if( wrFlag )
17d70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
17d80 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
17d90 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 42      if( NEVER(pB
17da0 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  t->readOnly) ){.
17db0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17dc0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
17dd0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 68 65    }.    rc = che
17de0 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63  ckForReadConflic
17df0 74 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c  ts(p, iTable, 0,
17e00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
17e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17e20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
17e30 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
17e40 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20  AREDCACHE );.   
17e50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17e60 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
17e70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b  Bt->pPage1==0 ){
17e80 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74  .    rc = lockBt
17e90 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29 3b  reeWithRetry(p);
17ea0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17eb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17ec0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
17ed0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e  .  }.  pCur->pgn
17ee0 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
17ef0 61 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  able;.  rc = sql
17f00 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
17f10 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
17f20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 29 3b 20  (int *)&nPage); 
17f30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
17f50 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
17f60 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 6e 50   iTable==1 && nP
17f70 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  age==0 ){.    rc
17f80 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b   = SQLITE_EMPTY;
17f90 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
17fa0 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
17fb0 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  n;.  }.  rc = ge
17fc0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
17fd0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
17fe0 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
17ff0 30 5d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  0]);.  if( rc!=S
18000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18010 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
18020 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
18030 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
18040 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
18050 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
18060 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
18070 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
18080 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20  variables, link 
18090 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
180a0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
180b0 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72  t and set *ppCur
180c0 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75   (the.  ** outpu
180d0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
180e0 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20  is function)..  
180f0 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  */.  pCur->pKeyI
18100 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
18110 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
18120 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
18130 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
18140 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c  rFlag = (u8)wrFl
18150 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
18160 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
18170 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
18180 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
18190 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
181a0 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
181b0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
181c0 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
181d0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
181e0 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64  ;.  pCur->cached
181f0 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20 72 65  Rowid = 0;..  re
18200 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18210 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65  .create_cursor_e
18220 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c 65  xception:.  rele
18230 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
18240 50 61 67 65 5b 30 5d 29 3b 0a 20 20 75 6e 6c 6f  Page[0]);.  unlo
18250 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
18260 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  pBt);.  return r
18270 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
18280 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
18290 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
182c0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
182d0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
18300 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
18310 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
18320 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18340 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
18350 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
18360 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
18370 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
18380 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18390 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
183a0 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
183b0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
183c0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183e0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
183f0 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
18400 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
18410 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18420 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
18430 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
18440 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
18450 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
18460 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18470 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18480 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18490 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
184a0 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
184b0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
184c0 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
184d0 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
184e0 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
184f0 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
18500 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
18510 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
18520 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
18530 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
18540 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
18550 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
18560 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
18570 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
18580 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
18590 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
185a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
185b0 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
185c0 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f  {.  return sizeo
185d0 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a  f(BtCursor);.}..
185e0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61  /*.** Set the ca
185f0 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65  ched rowid value
18600 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72   of every cursor
18610 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
18620 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73  abase file.** as
18630 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67   pCur and having
18640 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70   the same root p
18650 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43  age number as pC
18660 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ur.  The value i
18670 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77  s.** set to iRow
18680 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70  id..**.** Only p
18690 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61  ositive rowid va
186a0 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
186b0 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68  red valid for th
186c0 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65  is cache..** The
186d0 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61   cache is initia
186e0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69  lized to zero, i
186f0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76  ndicating an inv
18700 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41  alid cache..** A
18710 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b   btree will work
18720 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20   fine with zero 
18730 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
18740 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e  ds.  We just can
18750 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72  not.** cache zer
18760 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
18770 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e  wids, which mean
18780 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73  s tables that us
18790 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67  e zero or.** neg
187a0 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67  ative rowids mig
187b0 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
187c0 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20  slower.  But in 
187d0 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a  practice, zero.*
187e0 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  * or negative ro
187f0 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e  wids are very un
18800 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73  common so this s
18810 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70  hould not be a p
18820 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
18830 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
18840 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
18850 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74  sor *pCur, sqlit
18860 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29  e3_int64 iRowid)
18870 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
18880 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70  .  for(p=pCur->p
18890 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
188a0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
188b0 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
188c0 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
188d0 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69   ) p->cachedRowi
188e0 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  d = iRowid;.  }.
188f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18900 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f  cachedRowid==iRo
18910 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  wid );.}../*.** 
18920 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65  Return the cache
18930 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  d rowid for the 
18940 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41  given cursor.  A
18950 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72   negative or zer
18960 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  o.** return valu
18970 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
18980 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
18990 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   is invalid and 
189a0 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e  should be.** ign
189b0 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f  ored.  If the ro
189c0 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65  wid cache has ne
189d0 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
189e0 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a  set, then a.** z
189f0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
18a00 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
18a10 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  4 sqlite3BtreeGe
18a20 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
18a30 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
18a40 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63  return pCur->cac
18a50 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  hedRowid;.}../*.
18a60 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
18a70 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
18a80 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
18a90 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
18aa0 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
18ab0 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
18ac0 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
18ad0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
18ae0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
18af0 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
18b00 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
18b10 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
18b20 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ee ){.    int i;
18b30 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
18b40 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
18b50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18b60 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
18b70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
18b80 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
18b90 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
18ba0 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70  pPrev ){.      p
18bb0 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
18bc0 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
18bd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18be0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
18bf0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
18c00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
18c10 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
18c20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
18c30 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
18c40 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  v;.    }.    for
18c50 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
18c60 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
18c70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
18c80 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
18c90 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
18ca0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
18cb0 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t);.    invalida
18cc0 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
18cd0 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71  pCur);.    /* sq
18ce0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
18cf0 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
18d00 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
18d10 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
18d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18d30 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70  *.** Make a temp
18d40 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79 20  orary cursor by 
18d50 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66  filling in the f
18d60 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75  ields of pTempCu
18d70 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72  r..** The tempor
18d80 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  ary cursor is no
18d90 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  t on the cursor 
18da0 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74 72  list for the Btr
18db0 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
18dc0 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
18dd0 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
18de0 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a  pCur, BtCursor *
18df0 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 69 6e 74  pTempCur){.  int
18e00 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   i;.  assert( cu
18e10 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
18e20 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79  Cur) );.  memcpy
18e30 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c  (pTempCur, pCur,
18e40 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72   sizeof(BtCursor
18e50 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e  ));.  pTempCur->
18e60 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65  pNext = 0;.  pTe
18e70 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30  mpCur->pPrev = 0
18e80 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
18e90 70 54 65 6d 70 43 75 72 2d 3e 69 50 61 67 65 3b  pTempCur->iPage;
18ea0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
18eb0 65 33 50 61 67 65 72 52 65 66 28 70 54 65 6d 70  e3PagerRef(pTemp
18ec0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
18ed0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
18ee0 61 73 73 65 72 74 28 20 70 54 65 6d 70 43 75 72  assert( pTempCur
18ef0 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a 7d 0a 0a  ->pKey==0 );.}..
18f00 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74  /*.** Delete a t
18f10 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
18f20 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65  such as was made
18f30 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65   by the CreateTe
18f40 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a  mporaryCursor().
18f50 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  ** function abov
18f60 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
18f70 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
18f80 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
18f90 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
18fa0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  i;.  assert( cur
18fb0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
18fc0 75 72 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ur) );.  for(i=0
18fd0 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
18fe0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
18ff0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43  te3PagerUnref(pC
19000 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70  ur->apPage[i]->p
19010 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 73  DbPage);.  }.  s
19020 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
19030 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 0a 0a 0a 2f 2a  ->pKey);.}..../*
19040 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
19050 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
19060 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
19070 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
19080 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
19090 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
190a0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
190b0 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73  valid, call.** s
190c0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
190d0 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
190e0 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
190f0 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
19100 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
19110 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
19120 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
19130 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
19140 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
19150 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
19160 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
19170 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32  eCell()..**.** 2
19180 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72  007-06-25:  Ther
19190 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f  e is a bug in so
191a0 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d  me versions of M
191b0 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74  SVC that cause t
191c0 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74  he.** compiler t
191d0 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74  o crash when get
191e0 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d  CellInfo() is im
191f0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d  plemented as a m
19200 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65  acro..** But the
19210 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61  re is a measurea
19220 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74  ble speed advant
19230 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65  age to using the
19240 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a   macro on gcc.**
19250 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70   (when less comp
19260 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  iler optimizatio
19270 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d  ns like -Os or -
19280 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20  O0 are used and 
19290 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
192a0 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72  is not doing agr
192b0 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e  essive inlining.
192c0 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72  )  So we use a r
192d0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  eal function.** 
192e0 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d  for MSVC and a m
192f0 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68  acro for everyth
19300 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65  ing else.  Ticke
19310 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e  t #2457..*/.#ifn
19320 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
19330 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
19340 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
19350 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
19360 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
19370 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
19380 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
19390 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
193a0 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
193b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
193c0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
193d0 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72  age[iPage], pCur
193e0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20  ->aiIdx[iPage], 
193f0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
19400 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
19410 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
19420 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
19430 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
19440 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
19450 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
19460 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a  #ifdef _MSC_VER.
19470 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20    /* Use a real 
19480 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43  function in MSVC
19490 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
194a0 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d  bugs in that com
194b0 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74  piler. */.  stat
194c0 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
194d0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
194e0 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  ur){.    if( pCu
194f0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
19500 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
19510 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
19520 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
19530 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
19540 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
19550 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
19560 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
19570 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  o);.      pCur->
19580 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
19590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
195a0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
195b0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
195c0 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
195d0 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
195e0 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
195f0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
19600 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
19610 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
19620 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
19630 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
19680 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
19690 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
196d0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
196e0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71          \.    sq
19720 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
19730 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
19740 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
19750 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
19760 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70  ->info); \.    p
19770 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
19780 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
197c0 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
19810 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
19820 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19850 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
19860 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43  }.#endif /* _MSC
19870 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  _VER */../*.** S
19880 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
19890 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
198a0 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  fer needed to ho
198b0 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  ld the value of.
198c0 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74  ** the key for t
198d0 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
198e0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
198f0 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
19900 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65  .** to a valid e
19910 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20  ntry, *pSize is 
19920 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a  set to 0. .**.**
19930 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74   For a table wit
19940 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61  h the INTKEY fla
19950 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74  g set, this rout
19960 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
19970 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e  key.** itself, n
19980 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ot the number of
19990 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65   bytes in the ke
199a0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
199b0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74  3BtreeKeySize(Bt
199c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
199d0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
199e0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
199f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19a00 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
19a10 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
19a20 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
19a30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19a40 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
19a50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19a60 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
19a70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19a80 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
19a90 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
19aa0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
19ab0 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  LID ){.      *pS
19ac0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
19ad0 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
19ae0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
19af0 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
19b00 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
19b10 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19b20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
19b30 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
19b40 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
19b50 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
19b60 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
19b70 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
19b80 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72  ts to.  Always r
19b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
19ba0 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
19bb0 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66  ot possible.  If
19bc0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
19bd0 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  ot currently.** 
19be0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65  pointing to an e
19bf0 6e 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20  ntry (which can 
19c00 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d  happen, for exam
19c10 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64  ple, if.** the d
19c20 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
19c30 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73  ) then *pSize is
19c40 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e   set to 0..*/.in
19c50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
19c60 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
19c70 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
19c80 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
19c90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
19ca0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
19cb0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
19cc0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
19cd0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
19ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19cf0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
19d00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
19d10 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
19d20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
19d30 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
19d40 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19d50 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
19d60 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69        /* Not poi
19d70 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64  nting at a valid
19d80 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53   entry - set *pS
19d90 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20  ize to 0. */.   
19da0 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
19db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19dc0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
19dd0 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  );.      *pSize 
19de0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  = pCur->info.nDa
19df0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
19e00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19e10 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
19e20 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
19e30 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
19e40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
19e50 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
19e60 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
19e70 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
19e80 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
19e90 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
19ea0 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
19eb0 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
19ec0 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
19ed0 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
19ee0 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
19ef0 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
19f00 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
19f10 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
19f20 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
19f30 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
19f40 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
19f50 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
19f60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
19f70 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
19f80 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
19f90 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
19fa0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
19fb0 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
19fc0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
19fd0 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
19fe0 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
19ff0 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
1a000 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
1a010 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
1a020 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
1a030 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
1a040 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
1a050 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
1a060 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
1a070 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
1a080 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
1a090 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
1a0a0 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
1a0b0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1a0c0 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
1a0d0 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
1a0e0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
1a0f0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
1a100 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
1a110 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
1a120 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
1a130 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
1a140 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
1a150 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
1a160 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
1a170 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
1a180 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
1a190 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
1a1a0 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
1a1b0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
1a1c0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
1a1d0 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
1a1e0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20  tShared *pBt, . 
1a1f0 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a210 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a   Overflow page *
1a220 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
1a230 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1a240 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
1a250 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
1a260 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
1a270 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
1a280 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1a290 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
1a2a0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
1a2b0 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
1a2c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1a2d0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
1a2e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1a2f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a300 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a310 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a320 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
1a330 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a340 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1a350 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
1a360 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1a370 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1a380 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
1a390 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
1a3a0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
1a3b0 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
1a3c0 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
1a3d0 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
1a3e0 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
1a3f0 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
1a400 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
1a410 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
1a420 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
1a430 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
1a440 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
1a450 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
1a460 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1a470 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
1a480 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
1a490 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1a4a0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
1a4b0 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
1a4c0 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
1a4d0 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
1a4e0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1a4f0 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
1a500 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
1a510 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1a520 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
1a530 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
1a540 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72  f( iGuess<=pager
1a550 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
1a560 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
1a570 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
1a580 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
1a590 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1a5a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
1a5b0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1a5c0 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
1a5d0 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
1a5e0 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
1a5f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1a600 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
1a610 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1a620 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  f..  if( rc==SQL
1a630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1a640 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1a650 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
1a660 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , &pPage, 0);.  
1a670 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
1a680 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
1a690 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  =0);.    if( nex
1a6a0 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  t==0 && rc==SQLI
1a6b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
1a6c0 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
1a6d0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1a6e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
1a6f0 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
1a700 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
1a710 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
1a720 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1a730 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1a740 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1a750 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1a760 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
1a770 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
1a780 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
1a790 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
1a7a0 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
1a7b0 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
1a7c0 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
1a7d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
1a7e0 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
1a7f0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1a800 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
1a810 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
1a820 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
1a830 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
1a840 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
1a850 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
1a860 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
1a870 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
1a880 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
1a890 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a8a0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
1a8b0 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
1a8c0 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
1a8d0 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
1a8e0 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
1a8f0 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
1a900 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1a910 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
1a920 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
1a930 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1a940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1a950 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
1a960 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
1a970 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1a980 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
1a990 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a9b0 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
1a9c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
1a9d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1a9e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1a9f0 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
1aa00 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1aa20 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
1aa30 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
1aa40 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
1aa50 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
1aa60 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
1aa70 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
1aa80 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
1aa90 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
1aaa0 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
1aab0 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
1aac0 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
1aad0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1aae0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1aaf0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1ab00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ab10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1ab20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
1ab30 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
1ab40 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
1ab50 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
1ab60 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
1ab70 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
1ab80 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
1ab90 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1aba0 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
1abb0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1abc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1abd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1abe0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
1abf0 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
1ac00 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
1ac10 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
1ac20 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
1ac30 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
1ac40 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20  ting to. If the 
1ac50 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  eOp.** parameter
1ac60 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61   is 0, this is a
1ac70 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20   read operation 
1ac80 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74  (data copied int
1ac90 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
1aca0 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d  ). If it is non-
1acb0 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64  zero, a write (d
1acc0 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  ata copied from.
1acd0 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
1ace0 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
1acf0 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
1ad00 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1ad10 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
1ad20 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
1ad30 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
1ad40 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1ad50 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Buf..**.** This 
1ad60 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
1ad70 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74   make a distinct
1ad80 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20  ion between key 
1ad90 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20  and data..** It 
1ada0 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72  just reads or wr
1adb0 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20  ites bytes from 
1adc0 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61  the payload area
1add0 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a  .  Data might .*
1ade0 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  * appear on the 
1adf0 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20  main page or be 
1ae00 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
1ae10 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
1ae20 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a  ow .** pages..**
1ae30 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72  .** If the BtCur
1ae40 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61  sor.isIncrblobHa
1ae50 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
1ae60 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
1ae70 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72  t.** cursor entr
1ae80 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
1ae90 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
1aea0 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  s, this function
1aeb0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70  .** allocates sp
1aec0 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
1aed0 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65  ly popluates the
1aee0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1aef0 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72  ist .** cache ar
1af00 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
1af10 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71  verflow). Subseq
1af20 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
1af30 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20  his.** cache to 
1af40 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
1af50 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
1af60 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65  set more efficie
1af70 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
1af80 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
1af90 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
1afa0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
1afb0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61  t may be.** inva
1afc0 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
1afd0 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
1afe0 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
1aff0 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
1b000 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
1b010 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
1b020 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
1b030 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
1b040 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
1b050 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
1b060 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
1b070 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
1b080 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
1b090 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
1b0a0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
1b0b0 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
1b0c0 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
1b0d0 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
1b0e0 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
1b0f0 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
1b100 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
1b110 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
1b120 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
1b130 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
1b140 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
1b150 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1b160 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
1b170 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
1b180 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
1b190 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
1b1a0 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
1b1b0 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
1b1c0 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
1b1d0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
1b1e0 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
1b1f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1b200 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
1b210 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
1b220 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
1b230 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20  nt skipKey,     
1b240 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65      /* offset be
1b250 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20  gins at data if 
1b260 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
1b270 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
1b280 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
1b290 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
1b2a0 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
1b2b0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b2c0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
1b2d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b2e0 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
1b2f0 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
1b300 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1b310 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1b320 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
1b330 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
1b340 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
1b350 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1b360 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
1b370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1b380 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
1b390 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
1b3a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
1b3b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1b3c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b3d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1b3e0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1b3f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
1b400 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1b410 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b420 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b430 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  ;..  getCellInfo
1b440 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
1b450 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
1b460 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e  pCell + pCur->in
1b470 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b  fo.nHeader;.  nK
1b480 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74  ey = (pPage->int
1b490 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70  Key ? 0 : (int)p
1b4a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b  Cur->info.nKey);
1b4b0 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  ..  if( skipKey 
1b4c0 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  ){.    offset +=
1b4d0 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28   nKey;.  }.  if(
1b4e0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b   offset+amt > nK
1b4f0 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
1b500 61 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61 79  ata .   || &aPay
1b510 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1b520 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
1b530 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
1b540 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20  bleSize].  ){.  
1b550 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
1b560 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
1b570 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1b580 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
1b590 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
1b5a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1b5b0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
1b5c0 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
1b5d0 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
1b5e0 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
1b5f0 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
1b600 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
1b610 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
1b620 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
1b630 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
1b640 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
1b650 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
1b660 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
1b670 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
1b680 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
1b690 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
1b6a0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
1b6b0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
1b6c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1b6d0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1b6e0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
1b6f0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
1b700 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
1b710 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
1b720 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  Local;.  }..  if
1b730 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b740 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
1b750 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
1b760 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
1b770 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
1b780 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
1b790 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
1b7a0 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
1b7b0 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
1b7c0 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
1b7d0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
1b7e0 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66  ocal]);..#ifndef
1b7f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1b800 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20  RBLOB.    /* If 
1b810 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61  the isIncrblobHa
1b820 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
1b830 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f   and the BtCurso
1b840 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20  r.aOverflow[].  
1b850 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
1b860 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
1b870 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68  ocate it now. Th
1b880 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  e array is sized
1b890 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65   at.    ** one e
1b8a0 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
1b8b0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1b8c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
1b8d0 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61  n. The.    ** pa
1b8e0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1b8f0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
1b900 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  page is stored i
1b910 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a  n aOverflow[0],.
1b920 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61      ** etc. A va
1b930 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
1b940 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
1b950 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  y means "not yet
1b960 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28   known".    ** (
1b970 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
1b980 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
1b990 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1b9a0 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
1b9b0 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e  andle && !pCur->
1b9c0 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
1b9d0 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
1b9e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
1b9f0 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
1ba00 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
1ba10 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
1ba20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
1ba30 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69  w = (Pgno *)sqli
1ba40 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
1ba50 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c  zeof(Pgno)*nOvfl
1ba60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76  );.      if( nOv
1ba70 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  fl && !pCur->aOv
1ba80 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1ba90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1baa0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
1bab0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1bac0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1bad0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
1bae0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
1baf0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
1bb00 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
1bb10 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
1bb20 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
1bb30 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
1bb40 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
1bb50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
1bb60 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
1bb70 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1bb80 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
1bb90 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
1bba0 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
1bbb0 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
1bbc0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
1bbd0 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
1bbe0 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
1bbf0 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
1bc00 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1bc10 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
1bc20 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
1bc30 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
1bc40 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  +){..#ifndef SQL
1bc50 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1bc60 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  B.      /* If re
1bc70 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
1bc80 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1bc90 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
1bca0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
1bcb0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1bcc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
1bcd0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1bce0 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f  Idx] || pCur->aO
1bcf0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
1bd00 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
1bd10 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
1bd20 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
1bd30 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ge;.      }.#end
1bd40 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  if..      if( of
1bd50 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
1bd60 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1bd70 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
1bd80 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
1bd90 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
1bda0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1bdb0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
1bdc0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1bdd0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
1bde0 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
1bdf0 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
1be00 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
1be10 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
1be20 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
1be30 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
1be40 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
1be50 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
1be60 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
1be70 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
1be80 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
1be90 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65         */.#ifnde
1bea0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1beb0 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69  CRBLOB.        i
1bec0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1bed0 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
1bee0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
1bef0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
1bf00 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
1bf10 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
1bf20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23         } else .#
1bf30 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
1bf40 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
1bf50 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
1bf60 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
1bf70 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
1bf80 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
1bf90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bfa0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
1bfb0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
1bfc0 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
1bfd0 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
1bfe0 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
1bff0 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
1c000 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
1c010 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
1c020 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
1c030 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50    */.        DbP
1c040 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
1c050 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
1c060 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
1c070 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1c080 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
1c090 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29  tPage, &pDbPage)
1c0a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1c0b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c0c0 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
1c0d0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
1c0e0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
1c0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
1c100 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1c110 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
1c120 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
1c130 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
1c140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20  {.            a 
1c150 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
1c160 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  set;.          }
1c170 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c180 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
1c190 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
1c1a0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
1c1b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1c1c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1c1d0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
1c1e0 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
1c1f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
1c200 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
1c210 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
1c220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c230 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1c240 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c250 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
1c260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1c270 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1c280 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c290 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
1c2a0 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
1c2b0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
1c2c0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
1c2d0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
1c2e0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
1c2f0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
1c300 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
1c310 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
1c320 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
1c330 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1c340 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
1c350 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
1c360 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
1c370 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
1c380 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
1c390 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
1c3a0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
1c3b0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
1c3c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c3d0 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
1c3e0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
1c3f0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
1c400 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
1c410 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1c420 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1c430 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1c440 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
1c450 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
1c460 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c470 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c480 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1c490 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1c4a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c4b0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
1c4c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1c4d0 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28  Page] );.    if(
1c4e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
1c4f0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1c500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c510 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c520 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1c530 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1c540 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
1c550 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1c560 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
1c570 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
1c580 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
1c590 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
1c5a0 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20   char*)pBuf, 0, 
1c5b0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1c5c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1c5d0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
1c5e0 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
1c5f0 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
1c600 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
1c610 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
1c620 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
1c630 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
1c640 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
1c650 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
1c660 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1c670 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
1c680 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1c690 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1c6a0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
1c6b0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1c6c0 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
1c6d0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
1c6e0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
1c6f0 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
1c700 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
1c710 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
1c720 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
1c730 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
1c740 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
1c750 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c760 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
1c770 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
1c780 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1c790 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c7a0 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
1c7b0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1c7c0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1c7d0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1c7e0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1c7f0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1c800 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c810 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1c820 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1c830 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1c840 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1c850 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
1c860 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1c870 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20  r->iPage] );.   
1c880 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1c890 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1c8a0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
1c8b0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1c8c0 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
1c8d0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
1c8e0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
1c8f0 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  pBuf, 1, 0);.  }
1c900 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c910 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1c920 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
1c930 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
1c940 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
1c950 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
1c960 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1c970 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
1c980 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
1c990 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
1c9a0 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79  e key if skipKey
1c9b0 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74  ==0 and it point
1c9c0 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1c9d0 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a  ng of data if.**
1c9e0 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68   skipKey==1.  Th
1c9f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1ca00 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b  s of available k
1ca10 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
1ca20 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74  en.** into *pAmt
1ca30 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
1ca40 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
1ca50 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
1ca60 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70   be.** a valid p
1ca70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
1ca80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
1ca90 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
1caa0 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
1cab0 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
1cac0 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
1cad0 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
1cae0 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
1caf0 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
1cb00 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
1cb10 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
1cb20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
1cb30 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
1cb40 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
1cb50 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
1cb60 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
1cb70 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
1cb80 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
1cb90 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
1cba0 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
1cbb0 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
1cbc0 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
1cbd0 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79  emble.** the key
1cbe0 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
1cbf0 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
1cc00 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
1cc10 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
1cc20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
1cc30 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
1cc40 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
1cc50 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
1cc60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1cc70 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
1cc80 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
1cc90 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
1cca0 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
1ccb0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
1ccc0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
1ccd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74  signed char *fet
1cce0 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
1ccf0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1cd00 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
1cd10 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
1cd20 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1cd30 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20  int *pAmt,      
1cd40 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1cd50 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
1cd60 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
1cd70 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65   */.  int skipKe
1cd80 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  y          /* re
1cd90 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ad beginning at 
1cda0 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
1cdb0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  true */.){.  uns
1cdc0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
1cdd0 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20  load;.  MemPage 
1cde0 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b  *pPage;.  u32 nK
1cdf0 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c  ey;.  u32 nLocal
1ce00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
1ce10 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
1ce20 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
1ce30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1ce40 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
1ce50 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1ce60 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1ce70 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1ce80 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1ce90 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
1cea0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1ceb0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
1cec0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1ced0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1cee0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43  >nCell );.  getC
1cef0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1cf00 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1cf10 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
1cf20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
1cf30 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1cf40 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1cf50 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
1cf60 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1cf70 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43    nKey = (int)pC
1cf80 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1cf90 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79   }.  if( skipKey
1cfa0 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64   ){.    aPayload
1cfb0 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c   += nKey;.    nL
1cfc0 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
1cfd0 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b  o.nLocal - nKey;
1cfe0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1cff0 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
1d000 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66  o.nLocal;.    if
1d010 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b  ( nLocal>nKey ){
1d020 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  .      nLocal = 
1d030 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
1d040 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c    *pAmt = nLocal
1d050 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c  ;.  return aPayl
1d060 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
1d070 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
1d080 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
1d090 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
1d0a0 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
1d0b0 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
1d0c0 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
1d0d0 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
1d0e0 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
1d0f0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
1d100 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1d110 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
1d120 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
1d130 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
1d140 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
1d150 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
1d160 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
1d170 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
1d180 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
1d190 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
1d1a0 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
1d1b0 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
1d1c0 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
1d1d0 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
1d1e0 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
1d1f0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
1d200 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
1d210 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
1d220 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1d230 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
1d240 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
1d250 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
1d260 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
1d270 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
1d280 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
1d290 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1d2a0 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
1d2b0 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
1d2c0 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
1d2d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1d2e0 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72   *pAmt){.  asser
1d2f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1d300 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1d310 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1d320 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1d330 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1d340 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
1d350 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1d360 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
1d370 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
1d380 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1d390 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20  Cur, pAmt, 0);. 
1d3a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1d3b0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
1d3c0 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
1d3d0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
1d3e0 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
1d3f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d400 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1d410 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1d420 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1d430 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1d440 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1d450 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1d460 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1d470 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1d480 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1d490 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1d4a0 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
1d4b0 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n 0;.}.../*.** M
1d4c0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1d4d0 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
1d4e0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
1d4f0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
1d500 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
1d510 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
1d520 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
1d530 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1d540 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
1d550 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1d560 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
1d570 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70   rc;.  int i = p
1d580 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65  Cur->iPage;.  Me
1d590 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
1d5a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1d5b0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
1d5c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1d5d0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1d5e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d5f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1d600 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1d610 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1d620 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
1d630 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75  PTH );.  if( pCu
1d640 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
1d650 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
1d660 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1d670 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1d680 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
1d690 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1d6a0 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
1d6b0 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  wPage);.  if( rc
1d6c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1d6d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
1d6e0 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
1d6f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
1d700 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
1d710 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
1d720 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1d730 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1d740 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65  y = 0;.  if( pNe
1d750 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29  wPage->nCell<1 )
1d760 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d770 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d780 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1d790 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1d7a0 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
1d7b0 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
1d7c0 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
1d7d0 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
1d7e0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
1d7f0 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
1d800 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
1d810 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
1d820 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
1d830 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
1d840 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
1d850 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
1d860 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
1d870 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
1d880 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
1d890 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
1d8a0 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
1d8b0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
1d8c0 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
1d8d0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1d8e0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
1d8f0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
1d900 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
1d910 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28  hild){.  assert(
1d920 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
1d930 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
1d940 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
1d950 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
1d960 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
1d970 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
1d980 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
1d990 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
1d9a0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1d9b0 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
1d9c0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
1d9d0 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
1d9e0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
1d9f0 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
1da00 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
1da10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
1da20 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
1da30 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
1da40 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
1da50 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
1da60 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
1da70 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1da80 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
1da90 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
1daa0 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
1dab0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
1dac0 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
1dad0 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
1dae0 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
1daf0 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
1db00 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
1db10 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
1db20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1db30 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
1db40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1db50 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1db60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1db70 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1db80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1db90 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1dba0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1dbb0 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
1dbc0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1dbd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1dbe0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
1dbf0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
1dc00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1dc10 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
1dc20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1dc30 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
1dc40 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1dc50 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
1dc60 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1dc70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1dc80 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
1dc90 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
1dca0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1dcb0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1dcc0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f  idNKey = 0;.}../
1dcd0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1dce0 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74  rsor to the root
1dcf0 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20   page.*/.static 
1dd00 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
1dd10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1dd20 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
1dd30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1dd40 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
1dd50 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
1dd60 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
1dd70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
1dd80 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1dd90 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1dda0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
1ddb0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
1ddc0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1ddd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
1dde0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
1ddf0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1de00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1de10 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
1de20 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1de30 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
1de40 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
1de50 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
1de60 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
1de70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
1de80 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
1de90 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
1dea0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1deb0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1dec0 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
1ded0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
1dee0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1def0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
1df00 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
1df10 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1df20 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1df30 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  [i]);.    }.  }e
1df40 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20  lse{.    if( .  
1df50 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
1df60 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
1df70 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
1df80 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
1df90 61 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20 20  apPage[0])).    
1dfa0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
1dfb0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1dfc0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
1dfd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1dfe0 20 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43   }..  pRoot = pC
1dff0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
1e000 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1e010 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
1e020 52 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Root );.  pCur->
1e030 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 43 75  iPage = 0;.  pCu
1e040 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
1e050 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1e060 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1e070 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  >atLast = 0;.  p
1e080 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1e090 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74   0;..  if( pRoot
1e0a0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
1e0b0 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
1e0c0 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
1e0d0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
1e0e0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
1e0f0 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
1e100 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
1e110 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
1e120 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
1e130 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
1e140 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
1e150 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
1e160 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
1e170 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
1e180 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
1e190 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
1e1a0 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65  e = ((pRoot->nCe
1e1b0 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c  ll>0)?CURSOR_VAL
1e1c0 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ID:CURSOR_INVALI
1e1d0 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  D);.  }.  return
1e1e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
1e1f0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1e200 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
1e210 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
1e220 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
1e230 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
1e240 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1e250 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
1e260 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
1e270 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
1e280 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
1e290 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
1e2a0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
1e2b0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1e2c0 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
1e2d0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e2e0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
1e2f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e300 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
1e310 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1e320 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1e330 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1e340 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e350 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e360 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
1e370 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
1e380 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1e390 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e3a0 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
1e3b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1e3c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1e3d0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1e3e0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1e3f0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1e400 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
1e410 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
1e420 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1e430 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1e440 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e450 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
1e460 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1e470 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
1e480 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
1e490 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
1e4a0 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
1e4b0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1e4c0 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
1e4d0 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
1e4e0 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
1e4f0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
1e500 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
1e510 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1e520 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
1e530 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
1e540 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
1e550 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
1e560 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
1e570 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
1e580 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
1e590 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
1e5a0 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
1e5b0 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
1e5c0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
1e5d0 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
1e5e0 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
1e5f0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
1e600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1e610 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
1e620 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e630 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
1e640 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e650 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1e660 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
1e670 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1e680 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1e690 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1e6a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1e6b0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
1e6c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1e6d0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
1e6e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1e6f0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
1e700 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1e710 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1e720 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1e730 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
1e740 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1e750 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
1e760 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1e770 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
1e780 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  o);.  }.  if( rc
1e790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e7a0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1e7b0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
1e7c0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
1e7d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1e7e0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
1e7f0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1e800 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e810 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1e820 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
1e830 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
1e840 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1e850 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
1e860 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
1e870 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
1e880 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
1e890 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
1e8a0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
1e8b0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
1e8c0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1e8d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1e8e0 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
1e8f0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1e900 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1e910 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1e920 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1e930 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1e940 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e950 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1e960 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1e970 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1e980 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1e990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e9a0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1e9b0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1e9c0 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
1e9d0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1e9e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1e9f0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1ea00 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1ea10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ea20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ea30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ea40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ea50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
1ea60 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1ea70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1ea80 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1ea90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1eaa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1eab0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1eac0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1ead0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1eae0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1eaf0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1eb00 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1eb10 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1eb20 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1eb30 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1eb40 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1eb50 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1eb60 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1eb70 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
1eb80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1eb90 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1eba0 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
1ebb0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1ebc0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1ebd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ebe0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1ebf0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1ec00 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
1ec10 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
1ec20 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
1ec30 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
1ec40 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
1ec50 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
1ec60 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1ec70 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  && pCur->atLast 
1ec80 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1ec90 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
1eca0 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
1ecb0 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
1ecc0 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
1ecd0 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
1ece0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
1ecf0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
1ed00 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
1ed10 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
1ed20 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
1ed30 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
1ed40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1ed50 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
1ed60 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
1ed70 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
1ed80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1ed90 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
1eda0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
1edb0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1edc0 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
1edd0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1ede0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
1edf0 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
1ee00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ee10 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
1ee20 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1ee30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ee40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1ee50 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1ee60 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1ee70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1ee80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1ee90 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
1eea0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1eeb0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1eec0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1eed0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1eee0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1eef0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1ef00 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
1ef10 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
1ef20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
1ef30 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
1ef40 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20  OK ?1:0;.    }. 
1ef50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ef60 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1ef70 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
1ef80 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
1ef90 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
1efa0 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
1efb0 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
1efc0 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
1efd0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
1efe0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
1eff0 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
1f000 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
1f010 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
1f020 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
1f030 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
1f040 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
1f050 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
1f060 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
1f070 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
1f080 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
1f090 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
1f0a0 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
1f0b0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1f0c0 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
1f0d0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
1f0e0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
1f0f0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
1f100 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
1f110 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
1f120 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
1f130 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
1f140 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
1f150 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
1f160 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
1f170 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
1f180 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
1f190 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
1f1a0 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
1f1b0 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
1f1c0 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
1f1d0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
1f1e0 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
1f1f0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
1f200 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
1f210 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
1f220 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
1f230 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
1f240 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1f250 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
1f260 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
1f270 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
1f280 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
1f290 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1f2a0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
1f2b0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
1f2c0 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
1f2d0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
1f2e0 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
1f2f0 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
1f300 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1f310 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1f320 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f340 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
1f350 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
1f360 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1f370 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
1f380 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1f390 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1f3a0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1f3b0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
1f3c0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
1f3d0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
1f3e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1f3f0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
1f400 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1f410 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f420 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
1f430 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
1f440 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
1f450 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
1f460 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
1f470 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
1f480 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
1f490 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
1f4a0 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
1f4b0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1f4c0 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
1f4d0 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
1f4e0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f500 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
1f510 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
1f520 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1f530 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1f540 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1f550 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f560 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1f570 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1f580 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
1f590 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1f5a0 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
1f5b0 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
1f5c0 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
1f5d0 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
1f5e0 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1f5f0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1f600 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
1f610 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1f620 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
1f630 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
1f640 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
1f650 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
1f660 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1f670 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
1f680 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1f690 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1f6a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f6b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1f6c0 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
1f6d0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
1f6e0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
1f6f0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
1f700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f710 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
1f720 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1f730 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
1f740 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1f750 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1f760 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1f770 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
1f780 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1f790 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1f7a0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1f7b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1f7c0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1f7d0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1f7e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1f7f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1f800 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
1f810 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1f820 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1f830 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1f840 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
1f850 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
1f860 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
1f870 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
1f880 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
1f890 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1f8a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1f8b0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
1f8c0 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70  nt c = -1;  /* p
1f8d0 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61  Res return if ta
1f8e0 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73  ble is empty mus
1f8f0 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c  t be -1 */.    l
1f900 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
1f910 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1f920 3b 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  ;.    if( (!pPag
1f930 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64  e->intKey && pId
1f940 78 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70 72 3c  xKey==0) || upr<
1f950 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1f960 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f970 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1f980 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1f990 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61     }.    if( bia
1f9a0 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  sRight ){.      
1f9b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1f9c0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
1f9d0 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  upr;.    }else{.
1f9e0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1f9f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1fa00 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29   (u16)((upr+lwr)
1fa10 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  /2);.    }.    f
1fa20 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69 6e  or(;;){.      in
1fa30 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
1fa40 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1fa50 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75  ; /* Index of cu
1fa60 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
1fa70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  age */.      u8 
1fa80 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faa0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
1fab0 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
1fac0 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 70  Page */..      p
1fad0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1fae0 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  = 0;.      pCell
1faf0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1fb00 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
1fb10 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
1fb20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1fb30 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1fb40 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
1fb50 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1fb60 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
1fb70 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d          u32 dumm
1fb80 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
1fb90 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ll += getVarint3
1fba0 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b  2(pCell, dummy);
1fbb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fbc0 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
1fbd0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
1fbe0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
1fbf0 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
1fc00 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1fc10 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
1fc20 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
1fc30 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
1fc40 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
1fc50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fc60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1fc70 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
1fc80 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
1fc90 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1fca0 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
1fcb0 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  dNKey = 1;.     
1fcc0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
1fcd0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
1fce0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fcf0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
1fd00 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
1fd10 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36 38 20  e-size is 32768 
1fd20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
1fd30 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
1fd40 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
1fd50 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
1fd60 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
1fd70 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
1fd80 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
1fd90 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38 20 62  s at most 8198 b
1fda0 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61 79 20  ytes, which may 
1fdb0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
1fdc0 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
1fdd0 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
1fde0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
1fdf0 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
1fe00 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
1fe10 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
1fe20 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
1fe30 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
1fe40 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
1fe50 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
1fe60 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
1fe70 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
1fe80 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
1fe90 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
1fea0 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
1feb0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
1fec0 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
1fed0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
1fee0 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
1fef0 20 20 20 20 20 69 66 28 20 21 28 6e 43 65 6c 6c       if( !(nCell
1ff00 20 26 20 30 78 38 30 29 20 26 26 20 6e 43 65 6c   & 0x80) && nCel
1ff10 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  l<=pPage->maxLoc
1ff20 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
1ff30 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
1ff40 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
1ff50 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
1ff60 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
1ff70 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
1ff80 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
1ff90 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
1ffa0 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
1ffb0 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
1ffc0 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
1ffd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
1ffe0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1fff0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
20000 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
20010 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
20020 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
20030 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
20040 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
20050 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
20060 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
20070 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
20080 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
20090 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
200a0 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
200b0 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
200c0 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
200d0 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
200e0 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
200f0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
20100 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
20110 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  */.          c =
20120 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20130 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
20140 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
20150 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
20160 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20170 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
20180 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
20190 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
201a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
201b0 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
201c0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
201d0 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
201e0 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
201f0 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
20200 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
20210 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
20220 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
20230 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
20240 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
20250 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
20260 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
20270 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
20280 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
20290 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
202a0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
202b0 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
202c0 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
202d0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
202e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
202f0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
20300 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  r(pPage, pCellBo
20310 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
20320 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
20330 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
20340 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
20350 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
20360 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
20370 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ell );.         
20380 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
20390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
203a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
203b0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
203c0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
203d0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
203e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
203f0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
20400 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
20410 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
20420 6c 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lKey, 0, 0);.   
20430 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
20440 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20450 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
20460 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
20470 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20480 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
20490 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
204a0 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f  c ) goto moveto_
204b0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
204c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
204d0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
204e0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
204f0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
20500 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
20510 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
20520 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77          upr = lw
20530 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r - 1;.         
20540 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
20550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20560 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
20570 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20580 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
20590 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
205a0 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
205b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
205c0 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  c<0 ){.        l
205d0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
205e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
205f0 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
20600 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20610 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20  lwr>upr ){.     
20620 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20630 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  }.      pCur->ai
20640 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20650 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70   = (u16)((lwr+up
20660 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
20670 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
20680 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
20690 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
206a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
206b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
206c0 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
206d0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
206e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
206f0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
20700 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
20710 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
20720 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
20730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
20740 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
20750 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
20760 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
20770 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
20780 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20790 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
207a0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
207b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
207c0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
207d0 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
207e0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
207f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20800 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
20810 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
20820 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
20830 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
20840 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  6)lwr;.    pCur-
20850 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
20860 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
20870 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  NKey = 0;.    rc
20880 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
20890 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
208a0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
208b0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
208c0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
208d0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
208e0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
208f0 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
20900 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
20910 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
20920 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
20930 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
20940 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
20950 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
20960 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
20970 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
20980 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
20990 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
209a0 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ork..*/.int sqli
209b0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a  te3BtreeMoveto(.
209c0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
209d0 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
209e0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
209f0 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
20a00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
20a10 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
20a20 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
20a30 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
20a40 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
20a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
20a60 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
20a70 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
20a80 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
20a90 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
20aa0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
20ab0 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
20ac0 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
20ad0 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
20ae0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
20af0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
20b00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
20b30 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
20b40 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
20b50 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
20b60 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61   key */.  char a
20b70 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20  Space[150];     
20b80 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61       /* Temp spa
20b90 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d  ce for pIdxKey -
20ba0 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c   to avoid a mall
20bb0 6f 63 20 2a 2f 0a 0a 0a 20 20 69 66 28 20 70 4b  oc */...  if( pK
20bc0 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
20bd0 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
20be0 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
20bf0 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
20c00 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
20c10 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
20c20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
20c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c50 20 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73         aSpace, s
20c60 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a  izeof(aSpace));.
20c70 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
20c80 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
20c90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
20ca0 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
20cb0 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
20cc0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
20cd0 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
20ce0 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
20cf0 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
20d00 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  ( pKey ){.    sq
20d10 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
20d20 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49  npackedRecord(pI
20d30 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65  dxKey);.  }.  re
20d40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
20d50 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
20d60 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
20d70 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
20d80 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
20d90 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
20da0 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
20db0 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
20dc0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
20dd0 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
20de0 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
20df0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
20e00 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
20e10 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
20e20 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
20e30 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
20e40 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
20e50 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
20e60 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
20e70 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
20e80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
20e90 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
20ea0 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
20eb0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
20ec0 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
20ed0 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
20ee0 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
20ef0 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
20f00 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
20f10 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
20f20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
20f30 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
20f40 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
20f50 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
20f60 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
20f70 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
20f80 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
20f90 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
20fa0 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
20fb0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
20fc0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
20fd0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
20fe0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
20ff0 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
21000 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
21010 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
21020 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
21030 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
21040 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
21050 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
21060 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
21070 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
21080 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
21090 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
210a0 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
210b0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
210c0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
210d0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
210e0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
210f0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
21100 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21110 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
21120 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
21130 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
21140 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
21150 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
21160 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
21170 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
21180 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21190 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30  if( pCur->skip>0
211a0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
211b0 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
211c0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
211d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
211e0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
211f0 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
21200 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21210 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
21220 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
21230 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
21240 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
21250 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
21260 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43  ( idx<=pPage->nC
21270 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
21280 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
21290 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
212a0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78  y = 0;.  if( idx
212b0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
212c0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
212d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
212e0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
212f0 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
21300 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
21310 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
21320 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
21330 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
21340 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
21350 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
21360 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
21370 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
21380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
21390 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
213a0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
213b0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
213c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
213d0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
213e0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
213f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21410 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
21420 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
21430 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
21440 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21450 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
21460 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
21470 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
21480 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
21490 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
214a0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
214b0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
214c0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
214d0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
214e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
214f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21500 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
21510 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
21520 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
21530 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
21540 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21550 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
21560 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
21570 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21580 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
21590 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
215a0 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
215b0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
215c0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
215d0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
215e0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
215f0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
21600 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
21610 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
21620 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
21630 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
21640 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
21650 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
21660 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
21670 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21680 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
21690 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
216a0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
216b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
216c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
216d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
216e0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
216f0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
21700 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
21710 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21720 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
21730 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c  .  }.  pCur->atL
21740 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43  ast = 0;.  if( C
21750 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
21760 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
21770 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
21780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21790 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
217a0 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20  ur->skip<0 ){.  
217b0 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
217c0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
217d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
217e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
217f0 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
21800 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
21810 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21820 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
21830 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
21840 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
21850 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
21860 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
21870 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
21880 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
21890 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
218a0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
218b0 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
218c0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
218d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
218e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
218f0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
21900 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
21910 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21920 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
21930 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
21940 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
21950 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
21960 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
21970 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
21980 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
21990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
219a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
219b0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
219c0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
219d0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e    }.    pCur->in
219e0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
219f0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
21a00 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72  y = 0;..    pCur
21a10 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21a20 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
21a30 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
21a40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
21a50 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
21a60 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
21a70 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
21a80 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
21a90 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
21aa0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
21ab0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21ac0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
21ad0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
21ae0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21af0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
21b00 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
21b10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21b20 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
21b30 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
21b40 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
21b50 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
21b60 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
21b70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
21b80 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
21b90 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
21ba0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
21bb0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
21bc0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
21bd0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
21be0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
21bf0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
21c00 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
21c10 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
21c20 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
21c30 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
21c40 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
21c50 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
21c60 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
21c70 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
21c80 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
21c90 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
21ca0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
21cb0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
21cc0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
21cd0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
21ce0 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
21cf0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
21d00 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
21d10 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
21d20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
21d30 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
21d40 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
21d50 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
21d60 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
21d70 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
21d80 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
21d90 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
21da0 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
21db0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
21dc0 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
21dd0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
21de0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
21df0 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
21e00 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
21e10 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
21e20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
21e30 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
21e40 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
21e50 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
21e60 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
21e70 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
21e80 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
21e90 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
21ea0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
21eb0 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
21ec0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
21ed0 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
21ee0 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
21ef0 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
21f00 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
21f10 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
21f20 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
21f30 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
21f40 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
21f50 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
21f60 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
21f70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
21f80 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  1;.  int rc;.  i
21f90 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt n;     /* Num
21fa0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
21fb0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
21fc0 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20    int k;     /* 
21fd0 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
21fe0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
21ff0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
22000 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
22010 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
22020 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
22030 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
22040 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
22050 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
22060 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
22070 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65  pPage1;.  n = ge
22080 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
22090 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66  aData[36]);.  if
220a0 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
220b0 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
220c0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
220d0 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
220e0 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
220f0 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
22100 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
22110 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
22120 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
22130 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
22140 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
22150 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27  .    /* If the '
22160 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72  exact' parameter
22170 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20   was true and a 
22180 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
22190 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
221a0 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
221b0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
221c0 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
221d0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
221e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
221f0 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
22200 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
22210 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
22220 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22230 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
22240 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e    if( exact && n
22250 65 61 72 62 79 3c 3d 70 61 67 65 72 50 61 67 65  earby<=pagerPage
22260 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
22270 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
22280 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
22290 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  by>0 );.      as
222a0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
222b0 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72  acuum );.      r
222c0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
222d0 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
222e0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
222f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
22300 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
22310 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
22320 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61  E ){.        sea
22330 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
22340 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e     }.      *pPgn
22350 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  o = nearby;.    
22360 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
22370 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
22380 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
22390 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
223a0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
223b0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
223c0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
223d0 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
223e0 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
223f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
22400 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
22410 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
22420 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
22430 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
22440 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
22450 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
22460 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
22470 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
22480 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
22490 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
224a0 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
224b0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
224c0 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
224d0 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
224e0 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
224f0 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
22500 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
22510 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
22520 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e  rby' is located.
22530 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
22540 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
22550 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
22560 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
22570 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75   ){.        iTru
22580 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
22590 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
225a0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
225b0 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  e{.        iTrun
225c0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
225d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
225e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
225f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
22600 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
22610 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
22620 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
22630 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
22640 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
22650 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
22660 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _page;.      }..
22670 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
22680 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
22690 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
226a0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
226b0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
226c0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
226d0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
226e0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
226f0 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
22700 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
22710 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
22720 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
22730 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
22740 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
22750 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
22760 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
22770 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
22780 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
22790 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
227a0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
227b0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
227c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
227d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
227e0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
227f0 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
22800 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
22810 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
22820 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
22830 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
22840 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
22850 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
22860 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
22870 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
22880 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
22890 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
228a0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
228b0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
228c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
228d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
228e0 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 20  4 - 2 ){.       
228f0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
22900 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
22910 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
22920 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
22930 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
22940 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
22950 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
22960 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
22970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
22980 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
22990 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
229a0 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69  ist && nearby==i
229b0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
229c0 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
229d0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
229e0 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
229f0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
22a00 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
22a10 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
22a20 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
22a30 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
22a40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
22a50 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69  ssert( *pPgno==i
22a60 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20  Trunk );.       
22a70 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
22a80 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
22a90 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
22aa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22ab0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
22ac0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
22ad0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
22ae0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
22af0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
22b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22b10 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
22b20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
22b30 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
22b40 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
22b50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
22b60 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
22b70 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
22b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22b90 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
22ba0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
22bb0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
22bc0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
22bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22bf0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
22c00 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
22c10 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
22c20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
22c30 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
22c40 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
22c50 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
22c60 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
22c70 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
22c80 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
22c90 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
22ca0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
22cb0 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
22cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
22cd0 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
22ce0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
22cf0 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
22d00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22d10 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
22d20 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
22d30 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
22d40 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
22d50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22d60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
22d70 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
22d80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22d90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22da0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
22db0 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
22dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
22df0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
22e00 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
22e10 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
22e20 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
22e30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
22e40 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
22e50 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
22e60 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
22e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
22e80 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
22e90 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
22ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
22eb0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
22ec0 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
22ed0 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
22ee0 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
22ef0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
22f00 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
22f10 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
22f20 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
22f30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22f40 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
22f50 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
22f60 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
22f70 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
22f80 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
22f90 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
22fa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22fb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22fc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22fd0 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
22fe0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
22ff0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
23000 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
23010 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
23020 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23030 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
23040 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
23050 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
23060 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
23070 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23080 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
23090 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
230a0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
230b0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
230c0 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
230d0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
230e0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
230f0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
23100 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
23110 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
23120 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b      int closest;
23130 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
23140 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
23150 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
23160 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
23170 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  a;.        rc = 
23180 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
23190 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
231a0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
231b0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
231c0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
231d0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
231e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  }.        if( ne
231f0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
23200 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b      int i, dist;
23210 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
23220 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
23230 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74    dist = get4byt
23240 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
23250 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
23260 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69   if( dist<0 ) di
23270 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20  st = -dist;.    
23280 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
23290 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
232a0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67        int d2 = g
232b0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
232c0 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b  +i*4]) - nearby;
232d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
232e0 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32   d2<0 ) d2 = -d2
232f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23300 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
23310 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
23320 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
23330 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
23340 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23350 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23370 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
23380 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
23390 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
233a0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
233b0 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
233c0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
233d0 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61  st || iPage==nea
233e0 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
233f0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
23400 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e            Pgno n
23410 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
23420 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
23430 20 20 20 20 20 20 20 20 20 20 6e 50 61 67 65 20            nPage 
23440 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
23450 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 20  (pBt);.         
23460 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67   if( *pPgno>nPag
23470 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
23480 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66   /* Free page of
23490 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
234a0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
234b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
234c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
234d0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
234e0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
234f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
23500 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
23510 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
23520 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
23530 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
23550 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
23560 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
23570 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
23580 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
23590 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
235a0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
235b0 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
235c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
235d0 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
235e0 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
235f0 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
23600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23610 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
23620 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
23630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
23640 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
23650 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44  eable(pTrunk->pD
23660 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
23670 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
23680 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
23690 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
236a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
236b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
236c0 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
236d0 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
236e0 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
236f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
23710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23720 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
23730 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
23740 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
23750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23760 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
23770 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
23780 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
23790 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
237a0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
237b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
237c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
237d0 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
237e0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
237f0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
23800 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
23810 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
23820 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
23830 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
23840 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72   freelist, so cr
23850 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
23860 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  at the.    ** en
23870 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
23880 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  .    int nPage =
23890 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
238a0 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  pBt);.    *pPgno
238b0 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 20   = nPage + 1;.. 
238c0 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50     if( *pPgno==P
238d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
238e0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 28  (pBt) ){.      (
238f0 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d  *pPgno)++;.    }
23900 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23910 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
23920 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
23930 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d  toVacuum && PTRM
23940 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a  AP_ISPAGE(pBt, *
23950 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  pPgno) ){.      
23960 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
23970 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
23980 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
23990 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
239a0 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
239b0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
239c0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
239d0 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
239e0 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
239f0 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
23a00 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
23a10 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
23a20 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
23a30 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
23a40 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
23a50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
23a60 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
23a70 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
23a80 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
23a90 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f  page)\n", *pPgno
23aa0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
23ab0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
23ac0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
23ad0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
23ae0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
23af0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
23b00 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
23b10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23b20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
23b30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
23b40 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
23b50 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
23b60 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
23b70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
23b80 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
23b90 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
23ba0 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e  .      if( *pPgn
23bb0 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
23bc0 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70  PAGE(pBt) ){ (*p
23bd0 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d  Pgno)++; }.    }
23be0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
23bf0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
23c00 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
23c10 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
23c20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
23c30 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
23c40 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
23c50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
23c60 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
23c70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
23c80 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
23c90 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
23ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23cb0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
23cc0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
23cd0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
23ce0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
23cf0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
23d00 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
23d10 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
23d20 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
23d30 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
23d40 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
23d50 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
23d60 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
23d70 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
23d80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23d90 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
23da0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
23db0 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
23dc0 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
23dd0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
23de0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
23df0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23e00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
23e10 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
23e20 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
23e30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
23e40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
23e50 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
23e60 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
23e70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
23e80 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
23e90 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
23ea0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
23eb0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
23ec0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
23ed0 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
23ee0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
23ef0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
23f00 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
23f10 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
23f20 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
23f30 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
23f40 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
23f50 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
23f60 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
23f70 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
23f80 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
23f90 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
23fa0 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
23fb0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
23fc0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
23fd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
23fe0 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
23ff0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
24000 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
24010 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
24020 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
24030 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
24040 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
24050 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
24060 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
24070 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
24080 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
24090 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
240a0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
240b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240c0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
240d0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
240e0 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
240f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24100 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
24110 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
24120 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
24130 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
24140 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
24150 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
24160 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
24170 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
24180 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
24190 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
241a0 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
241b0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
241c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
241f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
24200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
24220 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
24230 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
24240 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
24250 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24260 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
24270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
24280 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
24290 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
242a0 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
242b0 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
242c0 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
242d0 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
242e0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
242f0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
24300 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
24310 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
24320 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
24330 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
24340 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
24350 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
24360 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
24370 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24380 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
24390 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
243a0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
243b0 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
243c0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
243d0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
243e0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
243f0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
24400 65 65 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53  ee+1);..#ifdef S
24410 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
24420 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ETE.  /* If the 
24430 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
24440 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  LETE compile-tim
24450 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
24460 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  led, then.  ** a
24470 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
24480 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
24490 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
244a0 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eros..  */.  if(
244b0 20 28 21 70 50 61 67 65 20 26 26 20 28 72 63 20   (!pPage && (rc 
244c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
244d0 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
244e0 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20  , &pPage, 0))). 
244f0 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
24500 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
24510 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
24520 44 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20  DbPage)).  ){.  
24530 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
24540 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  out;.  }.  memse
24550 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
24560 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
24570 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66  ageSize);.#endif
24580 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
24590 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
245a0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
245b0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
245c0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
245d0 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
245e0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
245f0 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
24600 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
24610 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
24620 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
24630 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
24640 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
24650 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
24660 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
24670 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
24680 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
24690 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
246a0 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
246b0 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
246c0 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
246d0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
246e0 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
246f0 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
24700 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
24710 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
24720 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
24730 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
24740 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
24750 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
24760 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
24770 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
24780 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
24790 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
247a0 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
247b0 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
247c0 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
247d0 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
247e0 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
247f0 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
24800 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
24810 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
24820 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65  0 ){.    int nLe
24830 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
24840 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
24850 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
24860 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
24870 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
24880 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
24890 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
248a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
248b0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
248c0 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
248d0 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
248e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
248f0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
24900 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
24910 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
24920 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
24930 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
24940 20 6e 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20 20   nLeaf<0 ){.    
24950 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
24960 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
24970 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
24980 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
24990 66 28 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73  f( nLeaf<pBt->us
249a0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
249b0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
249c0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
249d0 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
249e0 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
249f0 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
24a00 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
24a10 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
24a20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
24a30 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
24a40 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
24a50 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
24a60 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
24a70 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
24a80 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
24a90 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
24aa0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
24ab0 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
24ac0 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
24ad0 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
24ae0 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
24af0 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
24b00 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
24b10 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
24b20 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
24b30 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
24b40 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
24b50 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
24b60 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
24b70 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
24b80 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
24b90 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
24ba0 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
24bb0 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
24bc0 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
24bd0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
24be0 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
24bf0 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72  contain to restr
24c00 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
24c10 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
24c20 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
24c30 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
24c40 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
24c50 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
24c60 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
24c70 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
24c80 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
24c90 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
24ca0 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
24cb0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
24cc0 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
24cd0 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
24ce0 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
24cf0 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
24d00 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  8"..      */.   
24d10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24d20 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
24d30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
24d40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24d50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
24d60 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
24d70 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
24d80 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
24d90 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
24da0 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
24db0 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66   iPage);.#ifndef
24dc0 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
24dd0 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 69 66  ELETE.        if
24de0 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
24df0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
24e00 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
24e10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
24e20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
24e30 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
24e40 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
24e50 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
24e60 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
24e70 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
24e80 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
24e90 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
24ea0 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
24eb0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
24ec0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
24ed0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
24ee0 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
24ef0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
24f00 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
24f10 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
24f20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
24f30 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
24f40 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
24f50 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
24f60 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
24f70 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
24f80 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
24f90 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
24fa0 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
24fb0 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
24fc0 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
24fd0 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
24fe0 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
24ff0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
25000 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
25010 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
25020 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
25030 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
25040 2f 0a 20 20 69 66 28 20 20 20 28 28 21 70 50 61  /.  if(   ((!pPa
25050 67 65 29 20 26 26 20 28 30 20 21 3d 20 28 72 63  ge) && (0 != (rc
25060 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
25070 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
25080 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29 29  e, &pPage, 0))))
25090 0a 20 20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  .     || (0 != (
250a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
250b0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
250c0 62 50 61 67 65 29 29 29 0a 20 20 29 7b 0a 20 20  bPage))).  ){.  
250d0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
250e0 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
250f0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
25100 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
25110 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
25120 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
25130 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
25140 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
25150 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
25160 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
25170 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
25180 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
25190 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
251a0 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
251b0 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
251c0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
251d0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
251e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
251f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
25200 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
25210 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e   rc;.}.static in
25220 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  t freePage(MemPa
25230 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  ge *pPage){.  re
25240 74 75 72 6e 20 66 72 65 65 50 61 67 65 32 28 70  turn freePage2(p
25250 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
25260 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
25270 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
25280 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
25290 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
252a0 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
252b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
252c0 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
252d0 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
252e0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
252f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
25300 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
25310 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
25320 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
25330 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
25340 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66  nOvfl;.  u16 ovf
25350 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
25360 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25370 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
25380 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
25390 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
253a0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
253b0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
253c0 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
253d0 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
253e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
253f0 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
25400 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
25410 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
25420 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f  thing */.  }.  o
25430 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
25440 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
25450 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73  Overflow]);.  as
25460 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
25470 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
25480 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
25490 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
254a0 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e  4;.  nOvfl = (in
254b0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e  fo.nPayload - in
254c0 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  fo.nLocal + ovfl
254d0 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
254e0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
254f0 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d  sert( ovflPgno==
25500 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a  0 || nOvfl>0 );.
25510 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
25520 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   ){.    Pgno iNe
25530 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50  xt = 0;.    MemP
25540 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
25550 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
25560 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70  <2 || ovflPgno>p
25570 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
25580 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30  t) ){.      /* 0
25590 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
255a0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
255b0 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65  page 1 cannot be
255c0 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76   an .      ** ov
255d0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65  erflow page. The
255e0 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67  refore if ovflPg
255f0 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65  no<2 or past the
25600 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20   end of the .   
25610 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64     ** file the d
25620 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
25630 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
25640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25650 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
25660 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
25670 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
25680 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
25690 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
256a0 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
256b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
256c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
256d0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
256e0 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
256f0 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66  vflPgno);.    if
25700 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
25710 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
25720 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
25730 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
25740 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
25750 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
25760 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
25770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25780 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
25790 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
257a0 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
257b0 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
257c0 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
257d0 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
257e0 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
257f0 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
25800 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
25810 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
25820 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
25830 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
25840 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
25850 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
25860 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
25870 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
25880 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
25890 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
258a0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
258b0 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
258c0 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
258d0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
258e0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
258f0 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
25900 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
25910 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
25920 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
25930 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
25940 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
25950 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
25960 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
25970 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
25980 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
25990 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
259a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
259c0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
259d0 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
259e0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
259f0 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
25a00 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
25a10 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
25a20 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
25a30 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
25a40 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
25a50 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
25a60 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
25a70 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
25a80 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25aa0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
25ab0 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
25ac0 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
25ad0 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25af0 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
25b00 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
25b10 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
25b20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
25b30 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
25b40 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
25b50 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
25b60 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
25b70 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
25b80 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
25b90 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
25ba0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
25bb0 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
25bc0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
25bd0 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
25be0 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
25bf0 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c  t nHeader;.  Cel
25c00 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61  lInfo info;..  a
25c10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
25c20 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
25c30 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
25c40 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
25c50 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
25c60 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
25c70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
25c80 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
25c90 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
25ca0 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
25cb0 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
25cc0 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
25cd0 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
25ce0 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
25cf0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
25d00 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
25d10 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
25d20 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
25d30 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
25d40 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
25d50 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
25d60 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
25d70 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  0;.  if( !pPage-
25d80 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  >leaf ){.    nHe
25d90 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  ader += 4;.  }. 
25da0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
25db0 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  ata ){.    nHead
25dc0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
25dd0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
25de0 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20   nData+nZero);. 
25df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74   }else{.    nDat
25e00 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  a = nZero = 0;. 
25e10 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
25e20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
25e30 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
25e40 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69  *)&nKey);.  sqli
25e50 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
25e60 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
25e70 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
25e80 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
25e90 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
25ea0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
25eb0 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
25ec0 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
25ed0 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65  =(u32)(nData+nZe
25ee0 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ro) );.  .  /* F
25ef0 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
25f00 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
25f10 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
25f20 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
25f30 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
25f40 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
25f50 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
25f60 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
25f70 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b  lse{ .    if( nK
25f80 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  ey>0x7fffffff ||
25f90 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20   pKey==0 ){.    
25fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25fb0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20  CORRUPT;.    }. 
25fc0 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28     nPayload += (
25fd0 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53  int)nKey;.    pS
25fe0 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
25ff0 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  Src = (int)nKey;
26000 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  .  }.  *pnSize =
26010 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73   info.nSize;.  s
26020 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e  paceLeft = info.
26030 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f  nLocal;.  pPaylo
26040 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
26050 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d  der];.  pPrior =
26060 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76   &pCell[info.iOv
26070 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c  erflow];..  whil
26080 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b  e( nPayload>0 ){
26090 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
260a0 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ft==0 ){.#ifndef
260b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
260c0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
260d0 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
260e0 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
260f0 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
26100 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
26110 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
26120 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
26130 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
26140 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
26150 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
26160 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
26170 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
26180 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
26190 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
261a0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
261b0 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
261c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
261d0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
261e0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
261f0 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
26200 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
26210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26220 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
26230 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
26240 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
26250 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
26260 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
26270 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
26280 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
26290 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
262a0 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
262b0 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
262c0 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
262d0 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
262e0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
262f0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
26300 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
26310 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
26320 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
26330 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
26340 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
26350 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
26360 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
26370 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
26380 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
26390 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
263a0 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
263b0 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
263c0 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
263d0 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
263e0 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
263f0 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
26400 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
26410 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
26420 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
26430 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
26440 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
26450 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
26460 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
26470 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
26480 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
26490 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
264a0 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
264b0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
264c0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
264d0 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
264e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
264f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
26500 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
26510 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26520 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
26530 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
26540 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
26550 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
26560 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26570 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
26580 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
26590 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
265a0 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
265b0 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
265c0 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
265d0 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
265e0 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
265f0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
26600 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
26610 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
26620 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
26630 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
26640 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
26650 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
26660 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
26670 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
26680 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
26690 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
266a0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
266b0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
266c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
266d0 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
266e0 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
266f0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
26700 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
26710 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
26720 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
26730 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
26740 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
26750 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
26760 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
26770 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
26780 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
26790 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
267a0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
267b0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
267c0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
267d0 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
267e0 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
267f0 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
26800 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
26810 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
26820 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
26830 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
26840 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
26850 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
26860 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65  .    /* If pToRe
26870 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
26880 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20  o than pPayload 
26890 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
268a0 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a  data area.    **
268b0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
268c0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
268d0 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
268e0 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
268f0 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
26900 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
26910 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
26920 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
26930 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f  bPage) );..    /
26940 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73  * If pPayload is
26950 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
26960 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
26970 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
26980 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20  pPage.    ** is 
26990 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
269a0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
269b0 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61  Payload<pPage->a
269c0 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64  Data || pPayload
269d0 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
269e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
269f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
26a00 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
26a10 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
26a20 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66  Page) );..    if
26a30 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
26a40 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
26a50 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
26a60 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
26a70 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
26a80 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
26a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26aa0 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
26ab0 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
26ac0 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
26ad0 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
26ae0 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
26af0 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
26b00 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
26b10 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
26b20 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
26b30 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
26b40 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
26b50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
26b60 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
26b70 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
26b80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26b90 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
26ba0 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
26bb0 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
26bc0 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
26bd0 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
26be0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
26bf0 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
26c00 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
26c10 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
26c20 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
26c30 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
26c40 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
26c50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
26c60 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
26c70 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
26c80 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
26c90 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
26ca0 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
26cb0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
26cc0 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
26cd0 63 20 69 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d  c int dropCell(M
26ce0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
26cf0 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b  nt idx, int sz){
26d00 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
26d10 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
26d20 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
26d30 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
26d40 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
26d50 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
26d60 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
26d70 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
26d80 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
26d90 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
26da0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
26db0 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
26dc0 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
26dd0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
26de0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
26df0 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
26e00 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
26e10 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
26e20 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
26e30 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
26e40 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
26e50 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
26e60 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
26e70 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
26e80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
26e90 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
26ea0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
26eb0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
26ec0 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
26ed0 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
26ee0 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
26ef0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
26f00 70 74 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c  ptr);.  if( (pc<
26f10 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
26f20 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f  +6+(pPage->leaf?
26f30 30 3a 34 29 29 0a 20 20 20 20 20 7c 7c 20 28 70  0:4)).     || (p
26f40 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d  c+sz>pPage->pBt-
26f50 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a  >usableSize) ){.
26f60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26f70 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
26f80 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
26f90 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
26fa0 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sz);.  if( rc!=S
26fb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26fc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
26fd0 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c   for(i=idx+1; i<
26fe0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
26ff0 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20  +, ptr+=2){.    
27000 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b  ptr[0] = ptr[2];
27010 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74  .    ptr[1] = pt
27020 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  r[3];.  }.  pPag
27030 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75  e->nCell--;.  pu
27040 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
27050 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
27060 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
27070 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
27080 2b 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 53  += 2;.  return S
27090 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
270a0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
270b0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
270c0 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
270d0 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
270e0 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
270f0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
27100 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
27110 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
27120 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
27130 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
27140 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
27150 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
27160 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
27170 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
27180 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
27190 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
271a0 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
271b0 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
271c0 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
271d0 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
271e0 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
271f0 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
27200 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
27210 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
27220 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
27230 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
27240 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
27250 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
27260 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
27270 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
27280 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
27290 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
272a0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
272b0 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
272c0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
272d0 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
272e0 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
272f0 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
27300 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
27310 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
27320 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
27330 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
27340 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
27350 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
27360 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
27370 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
27380 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
27390 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
273a0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
273b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
273c0 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
273d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
273e0 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
273f0 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
27400 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
27410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
27420 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
27430 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
27440 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
27450 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
27460 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
27470 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
27480 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
27490 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
274a0 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
274b0 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
274c0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
274d0 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
274e0 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
274f0 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20  */.  u8 nSkip   
27500 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
27510 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74   write the first
27520 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
27530 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
27540 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
27550 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
27560 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
27570 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
27580 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
27590 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
275a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
275b0 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  top;          /*
275c0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
275d0 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  ontent for any c
275e0 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ell in data[] */
275f0 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
27600 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
27610 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
27620 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
27630 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
27640 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
27650 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
27660 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
27670 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
27680 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rted */.  int hd
27690 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
276a0 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b  ffset into data[
276b0 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  ] of the page he
276c0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
276d0 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
276e0 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
276f0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
27700 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
27710 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
27720 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
27730 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
27740 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
27750 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
27760 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
27770 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
27780 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ata[] */..  asse
27790 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
277a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
277b0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
277c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
277d0 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
277e0 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
277f0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
27800 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73  t)<=5460 );.  as
27810 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
27820 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
27830 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20  e(pPage->aOvfl) 
27840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
27850 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
27860 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  ge, pCell) );.  
27870 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
27880 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
27890 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
278a0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
278b0 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
278c0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
278d0 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
278e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
278f0 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c  emp+nSkip, pCell
27900 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
27910 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
27920 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
27930 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
27940 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
27950 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
27960 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
27970 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
27980 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20  >aOvfl[0])) );. 
27990 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
279a0 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  j].pCell = pCell
279b0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
279c0 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36  fl[j].idx = (u16
279d0 29 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  )i;.    pPage->n
279e0 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Free = 0;.  }els
279f0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
27a00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
27a10 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
27a20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
27a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27a40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
27a50 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
27a60 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
27a70 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
27a80 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
27a90 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
27aa0 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61  a;.    hdr = pPa
27ab0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
27ac0 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
27ad0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
27ae0 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
27af0 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
27b00 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
27b10 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
27b20 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a  age->nCell + 2;.
27b30 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
27b40 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
27b50 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20  if( end > top - 
27b60 73 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  sz ){.      rc =
27b70 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
27b80 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
27b90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27ba0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
27bb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
27bc0 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
27bd0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
27be0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27bf0 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20  end + sz <= top 
27c00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
27c10 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
27c20 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20  (pPage, sz);.   
27c30 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29   assert( idx>0 )
27c40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e  ;.    assert( en
27c50 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64  d <= get2byte(&d
27c60 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
27c70 20 20 20 69 66 20 28 69 64 78 2b 73 7a 20 3e 20     if (idx+sz > 
27c80 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
27c90 6c 65 53 69 7a 65 29 20 7b 0a 20 20 20 20 20 20  leSize) {.      
27ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
27cb0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
27cc0 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  }.    pPage->nCe
27cd0 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
27ce0 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20  >nFree -= 2;.   
27cf0 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
27d00 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b  x+nSkip], pCell+
27d10 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
27d20 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d  ;.    for(j=end-
27d30 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b  2, ptr=&data[j];
27d40 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74   j>ins; j-=2, pt
27d50 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72  r-=2){.      ptr
27d60 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20  [0] = ptr[-2];. 
27d70 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74       ptr[1] = pt
27d80 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  r[-1];.    }.   
27d90 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
27da0 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
27db0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
27dc0 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
27dd0 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
27de0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
27df0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
27e00 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
27e10 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
27e20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
27e30 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
27e40 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
27e50 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
27e60 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
27e70 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
27e80 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
27e90 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
27ea0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43        */.      C
27eb0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
27ec0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
27ed0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
27ee0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
27ef0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27f00 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
27f10 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
27f20 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e  fo.nKey))==info.
27f30 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
27f40 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
27f50 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
27f60 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
27f70 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
27f80 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
27f90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
27fa0 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
27fb0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50  pBt, pgnoOvfl, P
27fc0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
27fd0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
27fe0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27ff0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28000 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
28010 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
28020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28030 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
28040 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
28050 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
28060 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
28070 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
28080 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
28090 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
280a0 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
280b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
280c0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
280d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
280e0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
280f0 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a   be assemblied *
28100 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
28110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
28120 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
28130 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65  add to this page
28140 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
28150 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  l,      /* Point
28160 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69  ers to cell bodi
28170 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69  es */.  u16 *aSi
28180 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ze        /* Siz
28190 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  es of the cells 
281a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
281b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
281c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
281d0 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20  8 *pCellptr;    
281e0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
281f0 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
28200 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
28210 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
28220 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
28230 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63  body */.  u8 * c
28240 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
28250 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  e->aData;       
28260 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
28270 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61   to data for pPa
28280 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
28290 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
282a0 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
282b0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
282c0 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65   header on pPage
282d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
282e0 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d  nUsable = pPage-
282f0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
28300 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65  ; /* Usable size
28310 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61   of page */..  a
28320 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
28330 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
28340 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
28350 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
28360 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
28370 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
28380 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58  >=0 && nCell<=MX
28390 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
283a0 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ) && MX_CELL(pPa
283b0 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29  ge->pBt)<=5460 )
283c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
283d0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
283e0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
283f0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ge) );..  /* Che
28400 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
28410 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a   has just been z
28420 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67  eroed by zeroPag
28430 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e() */.  assert(
28440 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
28450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65   );.  assert( ge
28460 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
28470 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b  +5])==nUsable );
28480 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26  ..  pCellptr = &
28490 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
284a0 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32  Offset + nCell*2
284b0 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20  ];.  cellbody = 
284c0 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69  nUsable;.  for(i
284d0 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20  =nCell-1; i>=0; 
284e0 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c 6c 70  i--){.    pCellp
284f0 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c  tr -= 2;.    cel
28500 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65 5b 69  lbody -= aSize[i
28510 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  ];.    put2byte(
28520 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f  pCellptr, cellbo
28530 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  dy);.    memcpy(
28540 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
28550 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
28560 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 75 74  e[i]);.  }.  put
28570 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
28580 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75  3], nCell);.  pu
28590 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
285a0 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  +5], cellbody);.
285b0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
285c0 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73  = (nCell*2 + nUs
285d0 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29  able - cellbody)
285e0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
285f0 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d   = (u16)nCell;.}
28600 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
28610 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
28620 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
28630 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
28640 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
28650 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
28660 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
28670 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
28680 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
28690 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
286a0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
286b0 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
286c0 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
286d0 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
286e0 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
286f0 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
28700 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
28710 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
28720 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
28730 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
28740 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
28750 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
28760 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
28770 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
28780 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
28790 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
287a0 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
287b0 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
287c0 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
287d0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
287e0 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
287f0 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
28800 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
28810 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
28820 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
28830 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
28840 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
28850 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
28860 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
28870 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
28880 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
28890 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
288a0 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
288b0 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
288c0 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
288d0 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
288e0 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
288f0 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  e */../* Forward
28900 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
28910 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
28920 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29  (BtCursor*, int)
28930 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
28940 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
28950 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
28960 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
28970 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
28980 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
28990 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
289a0 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
289b0 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
289c0 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
289d0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
289e0 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
289f0 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
28a00 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
28a10 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
28a20 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
28a30 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
28a40 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c  ad of trying bal
28a50 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
28a60 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
28a70 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
28a80 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
28a90 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
28aa0 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
28ab0 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
28ac0 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
28ad0 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
28ae0 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
28af0 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
28b00 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
28b10 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
28b20 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
28b30 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
28b40 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
28b50 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
28b60 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
28b70 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
28b80 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
28b90 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
28ba0 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
28bb0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
28bc0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
28bd0 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
28be0 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
28bf0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
28c00 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
28c10 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
28c20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
28c30 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
28c40 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
28c50 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
28c60 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
28c70 75 69 63 6b 28 42 74 43 75 72 73 6f 72 20 2a 70  uick(BtCursor *p
28c80 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
28c90 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
28ca0 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  = 0;.  Pgno pgno
28cb0 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  New;.  u8 *pCell
28cc0 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a  ;.  u16 szCell;.
28cd0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
28ce0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
28cf0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
28d00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
28d10 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
28d20 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
28d30 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b  [pCur->iPage-1];
28d40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
28d50 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
28d60 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d   int parentIdx =
28d70 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
28d80 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65     /* pParent ne
28d90 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
28da0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ndex */.  int pa
28db0 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  rentSize;       
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
28dd0 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64  ize of new divid
28de0 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  er cell */.  u8 
28df0 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20  parentCell[64]; 
28e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e10 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20  * Space for the 
28e20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
28e30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
28e40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
28e50 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
28e60 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  tex) );..  /* Al
28e70 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
28e80 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76  e. Insert the ov
28e90 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d  erflow cell from
28ea0 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f   pPage.  ** into
28eb0 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65   it. Then remove
28ec0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
28ed0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20  ll from pPage.. 
28ee0 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
28ef0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
28f00 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
28f10 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  w, 0, 0);.  if( 
28f20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28f30 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 50 61  .    pCell = pPa
28f40 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
28f50 6c 6c 3b 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d  ll;.    szCell =
28f60 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
28f70 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
28f80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
28f90 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
28fa0 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
28fb0 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
28fc0 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  New, pPage->aDat
28fd0 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 6d  a[0]);.    assem
28fe0 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c  blePage(pNew, 1,
28ff0 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c   &pCell, &szCell
29000 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
29010 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 0a  verflow = 0;.  .
29020 20 20 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20      /* pPage is 
29030 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69  currently the ri
29040 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61  ght-child of pPa
29050 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69  rent. Change thi
29060 73 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74  s.    ** so that
29070 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
29080 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65   is the new page
29090 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65   allocated above
290a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70 50 61 67   and.    ** pPag
290b0 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f  e is the next-to
290c0 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20  -right child. . 
290d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 67 6e     **.    ** Ign
290e0 6f 72 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ore the return v
290f0 61 6c 75 65 20 6f 66 20 74 68 65 20 63 61 6c 6c  alue of the call
29100 20 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29   to fillInCell()
29110 2e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20  . fillInCell(). 
29120 20 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72     ** may only r
29130 65 74 75 72 6e 20 6f 74 68 65 72 20 74 68 61 6e  eturn other than
29140 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74   SQLITE_OK if it
29150 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
29160 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20  allocate.    ** 
29170 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
29180 66 6c 6f 77 20 70 61 67 65 73 2e 20 53 69 6e 63  flow pages. Sinc
29190 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61  e an internal ta
291a0 62 6c 65 20 42 2d 54 72 65 65 20 63 65 6c 6c 20  ble B-Tree cell 
291b0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65  .    ** may neve
291c0 72 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74  r spill over ont
291d0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
291e0 67 65 20 28 69 74 20 69 73 20 61 20 6d 61 78 69  ge (it is a maxi
291f0 6d 75 6d 20 6f 66 20 0a 20 20 20 20 2a 2a 20 31  mum of .    ** 1
29200 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 29  3 bytes in size)
29210 2c 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 63  , it is not necc
29220 65 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20  essary to check 
29230 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  the return code.
29240 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
29250 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e  imilarly, the in
29260 73 65 72 74 43 65 6c 6c 28 29 20 66 75 6e 63 74  sertCell() funct
29270 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ion cannot fail 
29280 69 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  if the page.    
29290 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  ** being inserte
292a0 64 20 69 6e 74 6f 20 69 73 20 61 6c 72 65 61 64  d into is alread
292b0 79 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 74  y writable and t
292c0 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
292d0 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   .    ** contain
292e0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69   an overflow poi
292f0 6e 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20  nter. So ignore 
29300 74 68 69 73 20 72 65 74 75 72 6e 20 63 6f 64 65  this return code
29310 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
29320 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29330 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 70  nCell>0 );.    p
29340 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
29350 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
29360 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  ell-1);.    sqli
29370 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
29380 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
29390 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 66  l, &info);.    f
293a0 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e  illInCell(pParen
293b0 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30  t, parentCell, 0
293c0 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20  , info.nKey, 0, 
293d0 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a  0, 0, &parentSiz
293e0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
293f0 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b  parentSize<64 );
29400 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
29410 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
29420 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
29430 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 69 6e  bPage) );.    in
29440 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
29450 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72  , parentIdx, par
29460 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53  entCell, parentS
29470 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  ize, 0, 4);.    
29480 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
29490 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
294a0 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50  t,parentIdx), pP
294b0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
294c0 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
294d0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
294e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
294f0 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20  pgnoNew);.  .   
29500 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
29510 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
29520 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
29530 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
29540 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
29550 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
29560 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
29570 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
29580 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
29590 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
295a0 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 20 20  rflow page..    
295b0 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
295c0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
295d0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
295e0 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
295f0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
29600 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
29610 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29620 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
29630 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
29640 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20  l(pNew, 0);.    
29650 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
29660 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
29670 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
29680 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
29690 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
296a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  );.  }..  /* At 
296b0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
296c0 50 61 67 65 2d 3e 6e 46 72 65 65 20 76 61 72 69  Page->nFree vari
296d0 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 20  able is not set 
296e0 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68 0a 20  correctly with. 
296f0 20 2a 2a 20 72 65 73 70 65 63 74 20 74 6f 20 74   ** respect to t
29700 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
29710 65 20 70 61 67 65 20 28 62 65 63 61 75 73 65 20  e page (because 
29720 69 74 20 77 61 73 20 73 65 74 20 74 6f 20 30 20  it was set to 0 
29730 62 79 20 0a 20 20 2a 2a 20 69 6e 73 65 72 74 43  by .  ** insertC
29740 65 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c 20 73 71  ell). So call sq
29750 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
29760 67 65 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72  ge() to make sur
29770 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 72  e it is.  ** cor
29780 72 65 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rect..  **.  ** 
29790 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 64  This has to be d
297a0 6f 6e 65 20 65 76 65 6e 20 69 66 20 61 6e 20 65  one even if an e
297b0 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74  rror will be ret
297c0 75 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  urned. Normally,
297d0 20 69 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   if.  ** an erro
297e0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
297f0 74 72 65 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20  tree balancing, 
29800 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
29810 4d 65 6d 50 61 67 65 20 61 72 65 0a 20 20 2a 2a  MemPage are.  **
29820 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 2c 20   not important, 
29830 61 73 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  as they will be 
29840 72 65 63 61 6c 63 75 6c 61 74 65 64 20 77 68 65  recalculated whe
29850 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 72 6f  n the page is ro
29860 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20  lled.  ** back. 
29870 42 75 74 20 68 65 72 65 2c 20 69 6e 20 62 61 6c  But here, in bal
29880 61 6e 63 65 5f 71 75 69 63 6b 28 29 2c 20 69 74  ance_quick(), it
29890 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
298a0 74 20 70 50 61 67 65 20 68 61 73 20 0a 20 20 2a  t pPage has .  *
298b0 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6d  * not yet been m
298c0 61 72 6b 65 64 20 64 69 72 74 79 20 6f 72 20 77  arked dirty or w
298d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
298e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
298f0 65 72 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20  erefore.  ** it 
29900 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c  will not be roll
29910 65 64 20 62 61 63 6b 20 61 6e 64 20 73 6f 20 69  ed back and so i
29920 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
29930 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
29940 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 64  .  ** the page d
29950 61 74 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73  ata and contents
29960 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65 20   of MemPage are 
29970 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f  consistent..  */
29980 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
29990 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 0;.  sqlite3B
299a0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
299b0 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge);.  assert( p
299c0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
299d0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65  =0 );..  /* If e
299e0 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 20 73  verything else s
299f0 75 63 63 65 65 64 65 64 2c 20 62 61 6c 61 6e 63  ucceeded, balanc
29a00 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
29a10 65 2c 20 69 6e 20 0a 20 20 2a 2a 20 63 61 73 65  e, in .  ** case
29a20 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
29a30 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65  l inserted cause
29a40 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f  d it to become o
29a50 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  verfull..  */.  
29a60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29a70 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  K ){.    release
29a80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
29a90 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
29aa0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
29ab0 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  (pCur, 0);.  }. 
29ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
29ad0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
29ae0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
29af0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
29b00 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
29b10 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70  butes Cells on p
29b20 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
29b30 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  N*2 siblings.** 
29b40 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74  of pPage so that
29b50 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
29b60 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61  about the same a
29b70 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
29b80 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20  ace..** Usually 
29b90 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
29ba0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
29bb0 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74  age is used in t
29bc0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a  he balancing,.**
29bd0 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62   though more sib
29be0 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
29bf0 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69   from one side i
29c00 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66  f pPage is the f
29c10 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20  irst.** or last 
29c20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
29c30 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68  ent.  If pPage h
29c40 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a  as fewer than 2*
29c50 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28  NN siblings.** (
29c60 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20  something which 
29c70 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
29c80 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
29c90 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a  root page or a .
29ca0 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74  ** child of root
29cb0 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
29cc0 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61  able siblings pa
29cd0 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
29ce0 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
29cf0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
29d00 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67  siblings of pPag
29d10 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
29d20 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
29d30 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74  d by one or.** t
29d40 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
29d50 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
29d60 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
29d70 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65  t over full. The
29d80 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
29d90 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20   special and is 
29da0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65  allowed to be ne
29db0 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70  arly empty. If p
29dc0 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20  Page is .** the 
29dd0 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
29de0 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
29df0 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69   tree might be i
29e00 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64  ncreased.** or d
29e10 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c  ecreased by one,
29e20 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74   as necessary, t
29e30 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20  o keep the root 
29e40 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a  page from being.
29e50 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63  ** overfull or c
29e60 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
29e70 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
29e80 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
29e90 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f  ne is called, so
29ea0 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20  me of the Cells 
29eb0 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  on pPage.** migh
29ec0 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
29ed0 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  e stored in pPag
29ee0 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69  e->aData[].  Thi
29ef0 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
29f00 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
29f10 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f  verfull.  Part o
29f20 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  f the job of thi
29f30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a  s routine is to.
29f40 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** make sure all
29f50 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65   Cells for pPage
29f60 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20   once again fit 
29f70 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
29f80 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  ]..**.** In the 
29f90 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
29fa0 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ing the siblings
29fb0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70   of pPage, the p
29fc0 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a  arent of pPage.*
29fd0 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f  * might become o
29fe0 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
29ff0 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68  full.  If that h
2a000 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69  appens, then thi
2a010 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
2a020 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
2a030 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  ly on the parent
2a040 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
2a050 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
2a060 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
2a070 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
2a080 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
2a090 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
2a0a0 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
2a0b0 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
2a0c0 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
2a0d0 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
2a0e0 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
2a0f0 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
2a100 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
2a110 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
2a120 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2a130 20 20 20 2f 2a 20 54 68 65 20 6f 76 65 72 20 6f     /* The over o
2a140 72 20 75 6e 64 65 72 66 75 6c 6c 20 70 61 67 65  r underfull page
2a150 20 74 6f 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20   to balance */. 
2a160 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
2a170 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2a180 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   The parent of p
2a190 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  Page */.  BtShar
2a1a0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
2a1b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
2a1c0 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
2a1d0 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
2a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a1f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
2a200 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
2a210 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
2a220 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a230 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
2a240 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
2a250 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
2a260 20 69 6e 74 20 6e 4f 6c 64 20 3d 20 30 3b 20 20   int nOld = 0;  
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a280 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2a290 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
2a2a0 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20   int nNew = 0;  
2a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a2c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2a2d0 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
2a2e0 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20   int nDiv;      
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a300 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
2a310 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20   in apDiv[] */. 
2a320 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a340 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2a350 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  /.  int idx;    
2a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a370 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61   /* Index of pPa
2a380 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ge in pParent->a
2a390 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
2a3a0 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
2a3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
2a3c0 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
2a3d0 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
2a3e0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
2a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a400 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
2a410 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2a420 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
2a430 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
2a440 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2a450 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
2a460 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a480 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
2a490 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
2a4a0 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
2a4b0 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
2a4c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2a4d0 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
2a4e0 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
2a4f0 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
2a500 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
2a510 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
2a520 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
2a530 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
2a540 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2a550 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
2a560 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
2a570 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
2a580 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
2a590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2a5a0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
2a5b0 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
2a5c0 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 32  */.  int iSpace2
2a5d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a5e0 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
2a5f0 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65  d byte of aSpace
2a600 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  2[] */.  int szS
2a610 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
2a620 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2a630 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
2a640 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
2a650 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
2a660 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
2a670 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
2a680 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
2a690 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42   Pgno pgnoOld[NB
2a6a0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
2a6b0 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
2a6c0 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
2a6d0 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  pOld[] */.  MemP
2a6e0 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b  age *apCopy[NB];
2a6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76           /* Priv
2a700 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70  ate copies of ap
2a710 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20  Old[] pages */. 
2a720 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b   MemPage *apNew[
2a730 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  NB+2];        /*
2a740 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
2a750 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74   NB siblings aft
2a760 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a  er balancing */.
2a770 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e    Pgno pgnoNew[N
2a780 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  B+2];          /
2a790 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66  * Page numbers f
2a7a0 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
2a7b0 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20  apNew[] */.  u8 
2a7c0 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20  *apDiv[NB];     
2a7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
2a7e0 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
2a7f0 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
2a800 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
2a810 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a820 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
2a830 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
2a840 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
2a850 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2a860 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
2a870 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
2a880 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
2a890 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2a8a0 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
2a8b0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
2a8c0 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
2a8d0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
2a8e0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2a8f0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
2a900 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
2a910 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
2a920 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20  8 *aCopy[NB];   
2a930 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
2a940 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  or holding data 
2a950 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20  of apCopy[] */. 
2a960 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20   u8 *aSpace1;   
2a970 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
2a980 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64   for copies of d
2a990 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 62 65  ividers cells be
2a9a0 66 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a  fore balance */.
2a9b0 20 20 75 38 20 2a 61 53 70 61 63 65 32 20 3d 20    u8 *aSpace2 = 
2a9c0 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63  0;       /* Spac
2a9d0 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64  e for overflow d
2a9e0 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 66  ividers cells af
2a9f0 74 65 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20  ter balance */. 
2aa00 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a   u8 *aFrom = 0;.
2aa10 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2aa20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2aa30 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
2aa40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2aa50 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2aa60 75 74 65 78 29 20 29 3b 0a 20 20 56 56 41 5f 4f  utex) );.  VVA_O
2aa70 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73  NLY( pCur->pages
2aa80 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a  Shuffled = 1 );.
2aa90 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64  .  /* .  ** Find
2aaa0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2aab0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2aac0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
2aad0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2aae0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
2aaf0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2ab00 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2ab10 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c  Page->pDbPage) |
2ab20 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  | pPage->nOverfl
2ab30 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d  ow==1 );.  pBt =
2ab40 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70   pPage->pBt;.  p
2ab50 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61  Parent = pCur->a
2ab60 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2ab70 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e-1];.  assert( 
2ab80 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28  pParent );.  if(
2ab90 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
2aba0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2abb0 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ite(pParent->pDb
2abc0 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 67 6f  Page)) ){.    go
2abd0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2abe0 75 70 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45  up;.  }..  TRACE
2abf0 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
2ac00 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
2ac10 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
2ac20 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
2ac30 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  pgno));..#ifndef
2ac40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
2ac50 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20  CKBALANCE.  /*. 
2ac60 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61   ** A special ca
2ac70 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e  se:  If a new en
2ac80 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65  try has just bee
2ac90 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
2aca0 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68  a.  ** table (th
2acb0 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77  at is, a btree w
2acc0 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ith integer keys
2acd0 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74   and all data at
2ace0 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a   the leaves).  *
2acf0 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e  * and the new en
2ad00 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  try is the right
2ad10 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74  -most entry in t
2ad20 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20  he tree (it has 
2ad30 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  the.  ** largest
2ad40 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74   key) then use t
2ad50 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e  he special balan
2ad60 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69  ce_quick() routi
2ad70 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61  ne for.  ** bala
2ad80 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f  ncing.  balance_
2ad90 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20  quick() is much 
2ada0 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c  faster and resul
2adb0 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a  ts in a tighter.
2adc0 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20    ** packing of 
2add0 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d  data in the comm
2ade0 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  on case..  */.  
2adf0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2ae00 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
2ae10 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20  intKey &&.      
2ae20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2ae30 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50 61  ==1 &&.      pPa
2ae40 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
2ae50 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26  ==pPage->nCell &
2ae60 26 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  &.      pParent-
2ae70 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20  >pgno!=1 &&.    
2ae80 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72    get4byte(&pPar
2ae90 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2aea0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2aeb0 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  )==pPage->pgno. 
2aec0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2aed0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
2aee0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
2aef0 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73  ODO: Check the s
2af00 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c  iblings to the l
2af10 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74  eft of pPage. It
2af20 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20   may be that.   
2af30 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74   ** they are not
2af40 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77   full and no new
2af50 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
2af60 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  d..    */.    re
2af70 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69  turn balance_qui
2af80 63 6b 28 70 43 75 72 29 3b 0a 20 20 7d 0a 23 65  ck(pCur);.  }.#e
2af90 6e 64 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49  ndif..  if( SQLI
2afa0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
2afb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2afc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20  Page->pDbPage)) 
2afd0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  ){.    goto bala
2afe0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
2aff0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
2b000 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65   the cell in the
2b010 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f   parent page who
2b020 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f  se left child po
2b030 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74  ints back.  ** t
2b040 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69  o pPage.  The "i
2b050 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20  dx" variable is 
2b060 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
2b070 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67  t cell.  If pPag
2b080 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69  e.  ** is the ri
2b090 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ghtmost child of
2b0a0 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65   pParent then se
2b0b0 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74  t idx to pParent
2b0c0 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20  ->nCell .  */.  
2b0d0 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
2b0e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2b0f0 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
2b100 49 6e 64 65 78 28 70 50 61 72 65 6e 74 2c 20 69  Index(pParent, i
2b110 64 78 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  dx, pPage->pgno)
2b120 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
2b130 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  d sibling pages 
2b140 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68 65  to pPage and the
2b150 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
2b160 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20 20  t that divide.  
2b170 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  ** the siblings.
2b180 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20    An attempt is 
2b190 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
2b1a0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
2b1b0 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20  er.  ** side of 
2b1c0 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62  pPage.  More sib
2b1d0 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
2b1e0 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
2b1f0 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20  owever, if.  ** 
2b200 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65 20  pPage there are 
2b210 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
2b220 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
2b230 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70 50  her side.  If pP
2b240 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
2b250 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
2b260 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
2b270 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
2b280 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f   are taken..  */
2b290 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d  .  nxDiv = idx -
2b2a0 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76   NN;.  if( nxDiv
2b2b0 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d   + NB > pParent-
2b2c0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78  >nCell ){.    nx
2b2d0 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Div = pParent->n
2b2e0 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20  Cell - NB + 1;. 
2b2f0 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30   }.  if( nxDiv<0
2b300 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
2b310 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20  0;.  }.  nDiv = 
2b320 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d  0;.  for(i=0, k=
2b330 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b  nxDiv; i<NB; i++
2b340 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , k++){.    if( 
2b350 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  k<pParent->nCell
2b360 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
2b370 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
2b380 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20  arent, k);.     
2b390 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61   nDiv++;.      a
2b3a0 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d  ssert( !pParent-
2b3b0 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70  >leaf );.      p
2b3c0 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
2b3d0 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
2b3e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d      }else if( k=
2b3f0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
2b400 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  ){.      pgnoOld
2b410 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26  [i] = get4byte(&
2b420 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2b430 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2b440 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
2b450 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
2b460 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
2b470 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
2b480 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61  , pgnoOld[i], &a
2b490 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
2b4a0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2b4b0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2b4c0 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64   /* apOld[i]->id
2b4d0 78 50 61 72 65 6e 74 20 3d 20 6b 3b 20 2a 2f 0a  xParent = k; */.
2b4e0 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20      apCopy[i] = 
2b4f0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  0;.    assert( i
2b500 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f  ==nOld );.    nO
2b510 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65  ld++;.    nMaxCe
2b520 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
2b530 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
2b540 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
2b550 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
2b560 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
2b570 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
2b580 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
2b590 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
2b5a0 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
2b5b0 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
2b5c0 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
2b5d0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
2b5e0 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
2b5f0 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a  ctures.  */.  sz
2b600 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
2b610 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
2b620 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
2b630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b640 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
2b650 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
2b660 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
2b670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b680 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
2b690 20 28 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28   (ROUND8(sizeof(
2b6a0 4d 65 6d 50 61 67 65 29 29 2b 70 42 74 2d 3e 70  MemPage))+pBt->p
2b6b0 61 67 65 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20  ageSize)*NB  /* 
2b6c0 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20  aCopy */.     + 
2b6d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2b700 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
2b710 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f   (ISAUTOVACUUM ?
2b720 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b   nMaxCells : 0);
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b740 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c  aFrom */.  apCel
2b750 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
2b760 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
2b770 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
2b780 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
2b790 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2b7a0 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
2b7b0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
2b7c0 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
2b7d0 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
2b7e0 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20  ls];.  aCopy[0] 
2b7f0 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
2b800 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
2b810 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2b820 41 4c 49 47 4e 4d 45 4e 54 28 61 43 6f 70 79 5b  ALIGNMENT(aCopy[
2b830 30 5d 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31  0]) );.  for(i=1
2b840 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<NB; i++){.  
2b850 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43    aCopy[i] = &aC
2b860 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61  opy[i-1][pBt->pa
2b870 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69  geSize+ROUND8(si
2b880 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b  zeof(MemPage))];
2b890 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61  .    assert( ((a
2b8a0 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 30  Copy[i] - (u8*)0
2b8b0 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
2b8c0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
2b8d0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d   required */.  }
2b8e0 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61 43  .  aSpace1 = &aC
2b8f0 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70  opy[NB-1][pBt->p
2b900 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
2b910 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
2b920 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2b930 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2b940 28 61 53 70 61 63 65 31 29 20 29 3b 0a 20 20 69  (aSpace1) );.  i
2b950 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2b960 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26  ){.    aFrom = &
2b970 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67  aSpace1[pBt->pag
2b980 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53  eSize];.  }.  aS
2b990 70 61 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50  pace2 = sqlite3P
2b9a0 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70  ageMalloc(pBt->p
2b9b0 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
2b9c0 61 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20  aSpace2==0 ){.  
2b9d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2b9e0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
2b9f0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2ba00 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
2ba10 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
2ba20 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50  he content of pP
2ba30 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
2ba40 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d  ings into aOld[]
2ba50 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20  ..  ** The rest 
2ba60 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2ba70 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66   will use data f
2ba80 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72  rom the copies r
2ba90 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ather.  ** that 
2baa0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2bab0 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
2bac0 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
2bad0 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20   be in the.  ** 
2bae0 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
2baf0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20   overwritten..  
2bb00 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2bb10 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
2bb20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43  MemPage *p = apC
2bb30 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
2bb40 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20  e*)aCopy[i];.   
2bb50 20 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64   memcpy(p, apOld
2bb60 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50  [i], sizeof(MemP
2bb70 61 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44  age));.    p->aD
2bb80 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b  ata = (void*)&p[
2bb90 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2bba0 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
2bbb0 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
2bbc0 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
2bbd0 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f   /*.  ** Load po
2bbe0 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65  inters to all ce
2bbf0 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70  lls on sibling p
2bc00 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76  ages and the div
2bc10 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
2bc20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61  into the local a
2bc30 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20  pCell[] array.  
2bc40 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
2bc50 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2bc60 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65  .  ** into space
2bc70 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61   obtained form a
2bc80 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d  Space1[] and rem
2bc90 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69  ove the the divi
2bca0 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66  der Cells.  ** f
2bcb0 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a  rom pParent..  *
2bcc0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69  *.  ** If the si
2bcd0 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65  blings are on le
2bce0 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74  af pages, then t
2bcf0 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  he child pointer
2bd00 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69  s of the.  ** di
2bd10 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20  vider cells are 
2bd20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68  stripped from th
2bd30 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74  e cells before t
2bd40 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20  hey are copied. 
2bd50 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31   ** into aSpace1
2bd60 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  [].  In this way
2bd70 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
2bd80 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68  pCell[] are with
2bd90 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70  out.  ** child p
2bda0 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62  ointers.  If sib
2bdb0 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
2bdc0 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63  aves, then all c
2bdd0 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65  ell in.  ** apCe
2bde0 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69  ll[] include chi
2bdf0 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69  ld pointers.  Ei
2be00 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65  ther way, all ce
2be10 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a  lls in apCell[].
2be20 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a    ** are alike..
2be30 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f    **.  ** leafCo
2be40 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20  rrection:  4 if 
2be50 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
2be60 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20    0 if pPage is 
2be70 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a  not a leaf..  **
2be80 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a         leafData:
2be90 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c    1 if pPage hol
2bea0 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20  ds key+data and 
2beb0 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e  pParent holds on
2bec0 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20  ly keys..  */.  
2bed0 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61  nCell = 0;.  lea
2bee0 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50  fCorrection = pP
2bef0 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  age->leaf*4;.  l
2bf00 65 61 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d  eafData = pPage-
2bf10 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28  >hasData;.  for(
2bf20 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
2bf30 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
2bf40 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
2bf50 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20  ;.    int limit 
2bf60 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
2bf70 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
2bf80 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
2bf90 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
2bfa0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
2bfb0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2bfc0 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
2bfd0 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  = findOverflowCe
2bfe0 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20  ll(pOld, j);.   
2bff0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
2c000 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2c010 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c  Old, apCell[nCel
2c020 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  l]);.      if( I
2c030 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2c040 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20         int a;.  
2c050 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
2c060 6c 5d 20 3d 20 28 75 38 29 69 3b 20 20 20 61 73  l] = (u8)i;   as
2c070 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
2c080 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  6 );.        for
2c090 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f  (a=0; a<pOld->nO
2c0a0 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20  verflow; a++){. 
2c0b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c           if( pOl
2c0c0 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c  d->aOvfl[a].pCel
2c0d0 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  l==apCell[nCell]
2c0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c0f0 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30  aFrom[nCell] = 0
2c100 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xFF;.           
2c110 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2c120 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2c130 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c      }.      nCel
2c140 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  l++;.    }.    i
2c150 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20  f( i<nOld-1 ){. 
2c160 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 63 65       u16 sz = ce
2c170 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
2c180 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  t, apDiv[i]);.  
2c190 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
2c1a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
2c1b0 69 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41  ith the LEAFDATA
2c1c0 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63   flag, pParent c
2c1d0 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49  ells hold only I
2c1e0 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20  NTKEYs that.    
2c1f0 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69      ** are dupli
2c200 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e  cates of keys on
2c210 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73   the child pages
2c220 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65  .  We need to re
2c230 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  move.        ** 
2c240 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2c250 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20  s from pParent, 
2c260 62 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73  but the dividers
2c270 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20   cells are not. 
2c280 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
2c290 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61  to apCell[] beca
2c2a0 75 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70  use they are dup
2c2b0 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64  licates of child
2c2c0 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20   cells..        
2c2d0 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43  */.        dropC
2c2e0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
2c2f0 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d  iv, sz);.      }
2c300 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38  else{.        u8
2c310 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20   *pTemp;.       
2c320 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
2c330 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2c340 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2c350 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20  ] = sz;.        
2c360 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
2c370 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
2c380 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a     iSpace1 += sz
2c390 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c3a0 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
2c3b0 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 20  ize/4 );.       
2c3c0 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31   assert( iSpace1
2c3d0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
2c3e0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
2c3f0 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
2c400 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  ], sz);.        
2c410 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
2c420 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
2c430 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  tion;.        if
2c440 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2c450 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72 6f  {.          aFro
2c460 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
2c470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c480 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
2c490 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b  ent, nxDiv, sz);
2c4a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2c4b0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2c4c0 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63  =0 || leafCorrec
2c4d0 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
2c4e0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
2c4f0 20 2d 3d 20 28 75 31 36 29 6c 65 61 66 43 6f 72   -= (u16)leafCor
2c500 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
2c510 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
2c520 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c  e(pTemp)==pgnoOl
2c530 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  d[i] );.        
2c540 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
2c550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
2c560 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
2c570 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
2c580 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
2c590 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
2c5a0 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20  child page pOld 
2c5b0 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
2c5c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
2c5d0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
2c5e0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
2c5f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
2c600 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
2c610 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e  ld->aData[pOld->
2c620 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29  hdrOffset+8], 4)
2c630 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2c640 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2c650 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
2c660 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
2c670 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
2c680 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
2c690 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
2c6a0 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73  llow any cells s
2c6b0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79  maller than 4 by
2c6c0 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tes. */.        
2c6d0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2c6e0 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20  ] = 4;.         
2c6f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2c700 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
2c710 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c720 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
2c730 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
2c740 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
2c750 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
2c760 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
2c770 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
2c780 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
2c790 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
2c7a0 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
2c7b0 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
2c7c0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
2c7d0 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
2c7e0 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
2c7f0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
2c800 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
2c810 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
2c820 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
2c830 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
2c840 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
2c850 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
2c860 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
2c870 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
2c880 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
2c890 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
2c8a0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2c8b0 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
2c8c0 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
2c8d0 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
2c8e0 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
2c8f0 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
2c900 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
2c910 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
2c920 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
2c930 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
2c940 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
2c950 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
2c960 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
2c970 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
2c980 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
2c990 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
2c9a0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
2c9b0 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
2c9c0 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
2c9d0 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
2c9e0 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
2c9f0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2ca00 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
2ca10 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
2ca20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
2ca30 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2ca40 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
2ca50 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
2ca60 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
2ca70 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
2ca80 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
2ca90 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
2caa0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
2cab0 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
2cac0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
2cad0 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
2cae0 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
2caf0 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    k++;.    }.  }
2cb00 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
2cb10 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
2cb20 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
2cb30 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
2cb40 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
2cb50 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
2cb60 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
2cb70 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
2cb80 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
2cb90 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
2cba0 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
2cbb0 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
2cbc0 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
2cbd0 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
2cbe0 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
2cbf0 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
2cc00 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
2cc10 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
2cc20 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
2cc30 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
2cc40 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
2cc50 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
2cc60 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
2cc70 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
2cc80 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
2cc90 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
2cca0 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
2ccb0 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
2ccc0 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
2ccd0 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
2cce0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
2ccf0 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
2cd00 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
2cd10 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
2cd20 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
2cd30 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
2cd40 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
2cd50 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
2cd60 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
2cd70 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
2cd80 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
2cd90 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
2cda0 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
2cdb0 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
2cdc0 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
2cdd0 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
2cde0 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
2cdf0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2ce00 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
2ce10 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
2ce20 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
2ce30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2ce40 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
2ce50 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
2ce60 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
2ce70 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
2ce80 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
2ce90 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
2cea0 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
2ceb0 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
2cec0 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
2ced0 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
2cee0 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
2cef0 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74  ht==0 || szRight
2cf00 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
2cf10 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
2cf20 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69  2) ){.      szRi
2cf30 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
2cf40 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
2cf50 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
2cf60 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
2cf70 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
2cf80 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
2cf90 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
2cfa0 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
2cfb0 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
2cfc0 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
2cfd0 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
2cfe0 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f  szLeft;.  }..  /
2cff0 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e  * Either we foun
2d000 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65  d one or more ce
2d010 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e  lls (cntnew[0])>
2d020 30 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65  0) or we are the
2d030 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
2d040 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
2d050 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
2d060 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
2d070 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
2d080 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
2d090 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
2d0a0 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
2d0b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2d0c0 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
2d0d0 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
2d0e0 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
2d0f0 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  ell==0) );..  /*
2d100 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
2d110 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
2d120 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
2d130 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
2d140 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
2d150 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
2d160 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65  ageFlags = pPage
2d170 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
2d180 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
2d190 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
2d1a0 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
2d1b0 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
2d1c0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
2d1d0 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pOld[i];.      p
2d1e0 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
2d1f0 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
2d200 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
2d210 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d220 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
2d230 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
2d240 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
2d250 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2d260 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2d270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2d280 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
2d290 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2d2a0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2d2b0 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d  New, &pgnoNew[i]
2d2c0 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20  , pgnoNew[i-1], 
2d2d0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2d2e0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
2d2f0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
2d300 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
2d310 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
2d320 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72    }.  }..  /* Fr
2d330 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
2d340 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
2d350 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
2d360 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
2d370 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
2d380 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70  rc = freePage(ap
2d390 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Old[i]);.    if(
2d3a0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2d3b0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2d3c0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
2d3d0 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
2d3e0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
2d3f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
2d400 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
2d410 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
2d420 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
2d430 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
2d440 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
2d450 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
2d460 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
2d470 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
2d480 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
2d490 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
2d4a0 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
2d4b0 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
2d4c0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
2d4d0 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
2d4e0 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
2d4f0 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
2d500 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
2d510 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
2d520 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
2d530 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
2d540 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
2d550 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
2d560 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
2d570 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
2d580 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
2d590 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
2d5a0 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
2d5b0 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
2d5c0 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
2d5d0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
2d5e0 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
2d5f0 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
2d600 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
2d610 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
2d620 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
2d630 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70      int minV = p
2d640 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69  gnoNew[i];.    i
2d650 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
2d660 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
2d670 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
2d680 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73   pgnoNew[j]<(uns
2d690 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20  igned)minV ){.  
2d6a0 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a        minI = j;.
2d6b0 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70          minV = p
2d6c0 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20  gnoNew[j];.     
2d6d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2d6e0 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20   minI>i ){.     
2d6f0 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65   int t;.      Me
2d700 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20  mPage *pT;.     
2d710 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b   t = pgnoNew[i];
2d720 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65  .      pT = apNe
2d730 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  w[i];.      pgno
2d740 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77  New[i] = pgnoNew
2d750 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70  [minI];.      ap
2d760 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d  New[i] = apNew[m
2d770 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  inI];.      pgno
2d780 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20  New[minI] = t;. 
2d790 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d       apNew[minI]
2d7a0 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d   = pT;.    }.  }
2d7b0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
2d7c0 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25  CE: old: %d %d %
2d7d0 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25  d  new: %d(%d) %
2d7e0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
2d7f0 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
2d800 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a     pgnoOld[0], .
2d810 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67      nOld>=2 ? pg
2d820 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20  noOld[1] : 0,.  
2d830 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f    nOld>=3 ? pgno
2d840 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  Old[2] : 0,.    
2d850 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65  pgnoNew[0], szNe
2d860 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d  w[0],.    nNew>=
2d870 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a  2 ? pgnoNew[1] :
2d880 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a   0, nNew>=2 ? sz
2d890 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  New[1] : 0,.    
2d8a0 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65  nNew>=3 ? pgnoNe
2d8b0 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[2] : 0, nNew>=
2d8c0 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30  3 ? szNew[2] : 0
2d8d0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20  ,.    nNew>=4 ? 
2d8e0 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20  pgnoNew[3] : 0, 
2d8f0 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b  nNew>=4 ? szNew[
2d900 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  3] : 0,.    nNew
2d910 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d  >=5 ? pgnoNew[4]
2d920 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20   : 0, nNew>=5 ? 
2d930 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a  szNew[4] : 0));.
2d940 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c  .  /*.  ** Evenl
2d950 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65  y distribute the
2d960 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b   data in apCell[
2d970 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77  ] across the new
2d980 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73   pages..  ** Ins
2d990 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ert divider cell
2d9a0 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61  s into pParent a
2d9b0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
2d9c0 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72  /.  j = 0;.  for
2d9d0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
2d9e0 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d  +){.    /* Assem
2d9f0 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c  ble the new sibl
2da00 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
2da10 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
2da20 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61   apNew[i];.    a
2da30 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
2da40 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ls );.    assert
2da50 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67  ( pNew->pgno==pg
2da60 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20  noNew[i] );.    
2da70 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
2da80 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61  ageFlags);.    a
2da90 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
2daa0 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
2dab0 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
2dac0 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
2dad0 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
2dae0 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
2daf0 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
2db00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
2db10 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
2db20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   );..    /* If t
2db30 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2db40 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2db50 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2db60 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er map entries. 
2db70 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74     ** that point
2db80 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73   to the siblings
2db90 20 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72   that were rearr
2dba0 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e  anged. These can
2dbb0 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a   be: left.    **
2dbc0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c   children of cel
2dbd0 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68  ls, the right-ch
2dbe0 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c  ild of the page,
2dbf0 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
2dc00 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  es.    ** pointe
2dc10 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20  d to by cells.. 
2dc20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
2dc30 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2dc40 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63      for(k=j; k<c
2dc50 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a  ntNew[i]; k++){.
2dc60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2dc70 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  k<nMaxCells );. 
2dc80 20 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d         if( aFrom
2dc90 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43  [k]==0xFF || apC
2dca0 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70  opy[aFrom[k]]->p
2dcb0 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20  gno!=pNew->pgno 
2dcc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2dcd0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
2dce0 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20  pNew, k-j);.    
2dcf0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2dd00 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43  LITE_OK && leafC
2dd10 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a  orrection==0 ){.
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2dd30 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2dd40 67 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b  get4byte(apCell[
2dd50 6b 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  k]), PTRMAP_BTRE
2dd60 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  E, pNew->pgno);.
2dd70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dd80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dd90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dda0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2ddb0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2ddc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ddd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2dde0 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77  ..    j = cntNew
2ddf0 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  [i];..    /* If 
2de00 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
2de10 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
2de20 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67   was not the rig
2de30 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c  ht-most sibling,
2de40 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61  .    ** insert a
2de50 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
2de60 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2de70 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
2de80 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a  f( i<nNew-1 && j
2de90 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  <nCell ){.      
2dea0 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
2deb0 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
2dec0 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20    int sz;..     
2ded0 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
2dee0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43  ells );.      pC
2def0 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b  ell = apCell[j];
2df00 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65  .      sz = szCe
2df10 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72  ll[j] + leafCorr
2df20 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54  ection;.      pT
2df30 65 6d 70 20 3d 20 26 61 53 70 61 63 65 32 5b 69  emp = &aSpace2[i
2df40 53 70 61 63 65 32 5d 3b 0a 20 20 20 20 20 20 69  Space2];.      i
2df50 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29  f( !pNew->leaf )
2df60 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
2df70 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d  (&pNew->aData[8]
2df80 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  , pCell, 4);.   
2df90 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
2dfa0 41 43 55 55 4d 20 0a 20 20 20 20 20 20 20 20 20  ACUUM .         
2dfb0 26 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78  && (aFrom[j]==0x
2dfc0 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72  FF || apCopy[aFr
2dfd0 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e  om[j]]->pgno!=pN
2dfe0 65 77 2d 3e 70 67 6e 6f 29 0a 20 20 20 20 20 20  ew->pgno).      
2dff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
2e000 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2e010 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
2e020 6c 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  l), PTRMAP_BTREE
2e030 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20  , pNew->pgno);. 
2e040 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2e050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e060 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
2e070 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2e080 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e090 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2e0a0 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
2e0b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2e0c0 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
2e0d0 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
2e0e0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
2e0f0 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
2e100 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
2e110 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
2e120 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
2e130 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
2e140 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
2e150 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
2e160 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
2e170 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
2e180 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
2e190 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
2e1a0 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
2e1b0 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
2e1c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2e1d0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
2e1e0 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
2e1f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e200 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
2e210 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a  r(pNew, apCell[j
2e220 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ], &info);.     
2e230 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
2e240 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
2e250 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e  illInCell(pParen
2e260 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66  t, pCell, 0, inf
2e270 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c  o.nKey, 0, 0, 0,
2e280 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69   &sz);.        i
2e290 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e2a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2e2b0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2e2c0 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  up;.        }.  
2e2d0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
2e2e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2e2f0 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
2e300 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
2e310 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
2e320 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
2e330 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
2e340 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
2e350 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
2e360 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
2e370 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
2e380 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
2e390 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
2e3a0 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
2e3b0 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
2e3c0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
2e3d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
2e3e0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e sqlite3BtreePa
2e3f0 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
2e400 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
2e410 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
2e420 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
2e430 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
2e440 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
2e450 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
2e460 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
2e470 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
2e480 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
2e490 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
2e4a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
2e4b0 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
2e4c0 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
2e4d0 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
2e4e0 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
2e4f0 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
2e500 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
2e510 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
2e520 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
2e530 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
2e540 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
2e550 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
2e560 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
2e570 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e580 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
2e590 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
2e5a0 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
2e5b0 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
2e5c0 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
2e5d0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2e5e0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
2e5f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2e600 69 53 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20  iSpace2 += sz;. 
2e610 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
2e620 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
2e630 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2e640 28 20 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e  ( iSpace2<=pBt->
2e650 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
2e660 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
2e670 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2e680 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
2e690 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66  mp, 4);.      if
2e6a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e6b0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
2e6c0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73  leanup;.      as
2e6d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2e6e0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2e6f0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
2e700 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
2e710 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
2e720 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76  ll(pParent,nxDiv
2e730 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  ), pNew->pgno);.
2e740 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
2e750 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2e760 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e  uum database, an
2e770 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74  d not a leaf-dat
2e780 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a  a tree,.      **
2e790 20 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65   then update the
2e7a0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74   pointer map wit
2e7b0 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  h an entry for t
2e7c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
2e7d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
2e7e0 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73  he cell just ins
2e7f0 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20  erted points to 
2e800 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20  (if any)..      
2e810 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
2e820 55 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65  UTOVACUUM && !le
2e830 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
2e840 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2e850 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Ovfl(pParent, nx
2e860 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Div);.        if
2e870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2e890 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2e8a0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
2e8b0 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a     }.      j++;.
2e8c0 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
2e8d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
2e8e0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2e8f0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e   entry for the n
2e900 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
2e910 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2e920 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2e930 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2e940 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  (pBt, pNew->pgno
2e950 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2e960 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
2e970 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2e980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e990 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2e9a0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
2e9b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2e9c0 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
2e9d0 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
2e9e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
2e9f0 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
2ea00 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
2ea10 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
2ea20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
2ea30 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
2ea40 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
2ea50 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
2ea60 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
2ea70 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28  ild, 4);.    if(
2ea80 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2ea90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2eaa0 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
2eab0 79 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52  yte(zChild), PTR
2eac0 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77  MAP_BTREE, apNew
2ead0 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
2eae0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2eaf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eb00 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2eb10 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2eb20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
2eb30 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2eb40 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2eb50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
2eb60 29 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d  );.  if( nxDiv==
2eb70 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70  pParent->nCell+p
2eb80 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2eb90 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  w ){.    /* Righ
2eba0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
2ebb0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
2ebc0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
2ebd0 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  t */.    put4byt
2ebe0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2ebf0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2ec00 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
2ec10 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c  [nNew-1]);.  }el
2ec20 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74  se{.    /* Right
2ec30 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
2ec40 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
2ec50 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  of the first ent
2ec60 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20  ry in pParent.  
2ec70 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69    ** past the ri
2ec80 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72  ght-most divider
2ec90 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75   entry */.    pu
2eca0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2ecb0 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
2ecc0 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77   nxDiv), pgnoNew
2ecd0 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a  [nNew-1]);.  }..
2ece0 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63    /*.  ** Balanc
2ecf0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
2ed00 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
2ed10 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28  e current page (
2ed20 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a  pPage) might.  *
2ed30 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  * have been adde
2ed40 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
2ed50 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f  t so it might no
2ed60 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69   longer be initi
2ed70 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74  alized..  ** But
2ed80 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2ed90 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
2eda0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2edb0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
2edc0 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ent->isInit );. 
2edd0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
2ede0 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61  ree(apCell);.  a
2edf0 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 54 52 41  pCell = 0;.  TRA
2ee00 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
2ee10 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20  nished with %d: 
2ee20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
2ee30 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
2ee40 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
2ee50 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43  , nOld, nNew, nC
2ee60 65 6c 6c 29 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ell));.  pPage->
2ee70 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
2ee80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2ee90 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ge);.  pCur->iPa
2eea0 67 65 2d 2d 3b 0a 20 20 72 63 20 3d 20 62 61 6c  ge--;.  rc = bal
2eeb0 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20  ance(pCur, 0);. 
2eec0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61   .  /*.  ** Clea
2eed0 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
2eee0 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
2eef0 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
2ef00 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 61 53  lite3PageFree(aS
2ef10 70 61 63 65 32 29 3b 0a 20 20 73 71 6c 69 74 65  pace2);.  sqlite
2ef20 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
2ef30 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
2ef40 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
2ef50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
2ef60 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
2ef70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
2ef80 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
2ef90 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
2efa0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 70  ;.  }.  pCur->ap
2efb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2efc0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  ]->nOverflow = 0
2efd0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
2efe0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2eff0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2f000 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
2f010 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65  e of a btree whe
2f020 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  n the root.** pa
2f030 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
2f040 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61  ells.  This is a
2f050 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
2f060 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a   make the tree.*
2f070 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f  * shallower by o
2f080 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ne level..*/.sta
2f090 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2f0a0 73 68 61 6c 6c 6f 77 65 72 28 42 74 43 75 72 73  shallower(BtCurs
2f0b0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2f0c0 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
2f0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
2f0e0 74 20 70 61 67 65 20 6f 66 20 42 2d 54 72 65 65  t page of B-Tree
2f0f0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2f100 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
2f110 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63     /* The only c
2f120 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61  hild page of pPa
2f130 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
2f140 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  oChild;         
2f150 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2f160 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a  ber for pChild *
2f170 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2f180 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2f190 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2f1a0 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
2f1b0 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  es */.  BtShared
2f1c0 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
2f1d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
2f1e0 61 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74  ain BTree struct
2f1f0 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43  ure */.  int mxC
2f200 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20  ellPerPage;     
2f210 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2f220 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2f230 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75   per page */.  u
2f240 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
2f250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2f260 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61  ll cells from pa
2f270 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ges being balanc
2f280 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
2f290 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2f2a0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
2f2b0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
2f2c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
2f2d0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a  ur->iPage==0 );.
2f2e0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2f2f0 61 70 50 61 67 65 5b 30 5d 3b 0a 0a 20 20 61 73  apPage[0];..  as
2f300 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2f310 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
2f320 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2f330 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2f340 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42  ->mutex) );.  pB
2f350 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2f360 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20    mxCellPerPage 
2f370 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a  = MX_CELL(pBt);.
2f380 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
2f390 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c  e3Malloc( mxCell
2f3a0 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28  PerPage*(sizeof(
2f3b0 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29  u8*)+sizeof(u16)
2f3c0 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c  ) );.  if( apCel
2f3d0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
2f3e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a  LITE_NOMEM;.  sz
2f3f0 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
2f400 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61  Cell[mxCellPerPa
2f410 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ge];.  if( pPage
2f420 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a  ->leaf ){.    /*
2f430 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f   The table is co
2f440 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a  mpletely empty *
2f450 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41  /.    TRACE(("BA
2f460 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62  LANCE: empty tab
2f470 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  le %d\n", pPage-
2f480 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65  >pgno));.  }else
2f490 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
2f4a0 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20  t page is empty 
2f4b0 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c  but has one chil
2f4c0 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65  d.  Transfer the
2f4d0 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
2f4e0 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e  ion from that on
2f4f0 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65  e child into the
2f500 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74   root page if it
2f510 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69   .    ** will fi
2f520 74 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  t.  This reduces
2f530 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
2f540 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20  e tree by one.. 
2f550 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2f560 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
2f570 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20   page 1, it has 
2f580 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c  less space avail
2f590 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a  able than.    **
2f5a0 20 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20   its child (due 
2f5b0 74 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20  to the 100 byte 
2f5c0 68 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75  header that occu
2f5d0 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  rs at the beginn
2f5e0 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ing.    ** of th
2f5f0 65 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c  e database fle),
2f600 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74   so it might not
2f610 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64   be able to hold
2f620 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20   all of the .   
2f630 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
2f640 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
2f650 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64  ned in the child
2f660 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68  .  If this is th
2f670 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20  e .    ** case, 
2f680 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74  then do not do t
2f690 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65  he transfer.  Le
2f6a0 61 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79  ave page 1 empty
2f6b0 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
2f6c0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  or the right-poi
2f6d0 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c  nter to the chil
2f6e0 64 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69  d page.  The chi
2f6f0 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a  ld page becomes.
2f700 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75      ** the virtu
2f710 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  al root of the t
2f720 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ree..    */.    
2f730 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e  VVA_ONLY( pCur->
2f740 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
2f750 31 20 29 3b 0a 20 20 20 20 70 67 6e 6f 43 68 69  1 );.    pgnoChi
2f760 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
2f770 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2f780 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2f790 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
2f7a0 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20  noChild>0 );.   
2f7b0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
2f7c0 6c 64 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  ld<=pagerPagecou
2f7d0 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 29 20 29  nt(pPage->pBt) )
2f7e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2f7f0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2f800 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43  Page->pBt, pgnoC
2f810 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30  hild, &pChild, 0
2f820 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2f830 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
2f840 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66  _balance;.    if
2f850 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  ( pPage->pgno==1
2f860 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2f870 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2f880 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
2f890 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2f8a0 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
2f8b0 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65  ance;.      asse
2f8c0 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  rt( pChild->nOve
2f8d0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20  rflow==0 );.    
2f8e0 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46    if( pChild->nF
2f8f0 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20  ree>=100 ){.    
2f900 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64      /* The child
2f910 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c   information wil
2f920 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
2f930 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68  t page, so do th
2f940 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  e.        ** cop
2f950 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  y */.        int
2f960 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f   i;.        zero
2f970 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
2f980 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  ld->aData[0]);. 
2f990 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2f9a0 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b  i<pChild->nCell;
2f9b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2f9c0 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e   apCell[i] = fin
2f9d0 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b  dCell(pChild,i);
2f9e0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c  .          szCel
2f9f0 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  l[i] = cellSizeP
2fa00 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c  tr(pChild, apCel
2fa10 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
2fa20 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c  .        assembl
2fa30 65 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  ePage(pPage, pCh
2fa40 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65  ild->nCell, apCe
2fa50 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20  ll, szCell);.   
2fa60 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65       /* Copy the
2fa70 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f   right-pointer o
2fa80 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74  f the child to t
2fa90 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  he parent. */.  
2faa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2fab0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2fac0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2fad0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
2fae0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2faf0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2fb00 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20  drOffset+8], .  
2fb10 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
2fb20 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74  te(&pChild->aDat
2fb30 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66  a[pChild->hdrOff
2fb40 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
2fb50 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2fb60 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  pChild);.       
2fb70 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2fb80 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73  : child %d trans
2fb90 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22  fer to page 1\n"
2fba0 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
2fbb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2fbc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
2fbd0 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66  ild has more inf
2fbe0 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
2fbf0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
2fc00 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ot..        ** T
2fc10 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61  he tree is alrea
2fc20 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f  dy balanced.  Do
2fc30 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20   nothing. */.   
2fc40 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
2fc50 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77  ANCE: child %d w
2fc60 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70  ill not fit on p
2fc70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64  age 1\n", pChild
2fc80 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2fc90 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2fca0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d     memcpy(pPage-
2fcb0 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e  >aData, pChild->
2fcc0 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42  aData, pPage->pB
2fcd0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
2fce0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49        pPage->isI
2fcf0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  nit = 0;.      r
2fd00 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2fd10 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
2fd20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
2fd30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2fd40 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
2fd50 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52  Child);.      TR
2fd60 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74  ACE(("BALANCE: t
2fd70 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64  ransfer child %d
2fd80 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22   into root %d\n"
2fd90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2fda0 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50  pChild->pgno, pP
2fdb0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
2fdc0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2fdd0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2fde0 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
2fdf0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2fe00 43 55 55 4d 0a 20 20 20 20 69 66 28 20 49 53 41  CUUM.    if( ISA
2fe10 55 54 4f 56 41 43 55 55 4d 20 26 26 20 72 63 3d  UTOVACUUM && rc=
2fe20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fe30 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
2fe40 64 50 74 72 6d 61 70 73 28 70 50 61 67 65 29 3b  dPtrmaps(pPage);
2fe50 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2fe60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
2fe70 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73  hild);.  }.end_s
2fe80 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a  hallow_balance:.
2fe90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
2fea0 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pCell);.  return
2feb0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
2fec0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2fed0 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57  overfull.**.** W
2fee0 68 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73  hen this happens
2fef0 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  , Create a new c
2ff00 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f  hild page and co
2ff10 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  py the.** conten
2ff20 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69  ts of the root i
2ff30 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20  nto the child.  
2ff40 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f  Then make the ro
2ff50 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d  ot.** page an em
2ff60 70 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69  pty page with ri
2ff70 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e  ghtChild pointin
2ff80 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  g to the new.** 
2ff90 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79  child.   Finally
2ffa0 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69  , call balance_i
2ffb0 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65  nternal() on the
2ffc0 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f   new child.** to
2ffd0 20 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c   cause it to spl
2ffe0 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
2fff0 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
30000 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
30010 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
30020 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30030 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
30040 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
30050 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
30060 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
30070 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
30080 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
30090 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  hild;    /* Poin
300a0 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69  ter to a new chi
300b0 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ld page */.  Pgn
300c0 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
300d0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
300e0 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  of the new child
300f0 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61   page */.  BtSha
30100 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
30110 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a    /* The BTree *
30120 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
30130 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ze;     /* Total
30140 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   usable size of 
30150 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  a page */.  u8 *
30160 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
30170 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
30180 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f  e parent page */
30190 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20  .  u8 *cdata;   
301a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
301b0 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  t of the child p
301c0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  age */.  int hdr
301d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
301e0 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68  Offset to page h
301f0 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20  eader in parent 
30200 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
30210 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
30220 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66  et to content of
30230 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70   first cell in p
30240 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  arent */..  asse
30250 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
30260 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
30270 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
30280 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a  >nOverflow>0 );.
30290 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75  .  VVA_ONLY( pCu
302a0 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64  r->pagesShuffled
302b0 20 3d 20 31 20 29 3b 0a 20 20 70 50 61 67 65 20   = 1 );.  pPage 
302c0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
302d0 5d 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  ];.  pBt = pPage
302e0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
302f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
30300 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
30310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30320 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
30330 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
30340 61 67 65 29 20 29 3b 0a 20 20 72 63 20 3d 20 61  age) );.  rc = a
30350 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
30360 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26  (pBt, &pChild, &
30370 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65  pgnoChild, pPage
30380 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66  ->pgno, 0);.  if
30390 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
303a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
303b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
303c0 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50  ble(pChild->pDbP
303d0 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  age) );.  usable
303e0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
303f0 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d  leSize;.  data =
30400 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
30410 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
30420 72 4f 66 66 73 65 74 3b 0a 20 20 63 62 72 6b 20  rOffset;.  cbrk 
30430 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
30440 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74  [hdr+5]);.  cdat
30450 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  a = pChild->aDat
30460 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74  a;.  memcpy(cdat
30470 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70  a, &data[hdr], p
30480 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
30490 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  +2*pPage->nCell-
304a0 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  hdr);.  memcpy(&
304b0 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61  cdata[cbrk], &da
304c0 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ta[cbrk], usable
304d0 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 0a 20 20 61  Size-cbrk);..  a
304e0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69  ssert( pChild->i
304f0 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63  sInit==0 );.  rc
30500 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
30510 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b  nitPage(pChild);
30520 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30530 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
30540 6e 43 6f 70 79 20 3d 20 70 50 61 67 65 2d 3e 6e  nCopy = pPage->n
30550 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28  Overflow*sizeof(
30560 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
30570 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 68  ;.    memcpy(pCh
30580 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67  ild->aOvfl, pPag
30590 65 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f 70 79 29  e->aOvfl, nCopy)
305a0 3b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f  ;.    pChild->nO
305b0 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d  verflow = pPage-
305c0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
305d0 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  if( pChild->nOve
305e0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  rflow ){.      p
305f0 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30  Child->nFree = 0
30600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
30610 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  rt( pChild->nCel
30620 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  l==pPage->nCell 
30630 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
30640 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
30650 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
30660 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 7a 65  bPage) );.    ze
30670 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  roPage(pPage, pC
30680 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26  hild->aData[0] &
30690 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20   ~PTF_LEAF);.   
306a0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
306b0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
306c0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
306d0 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 54 52 41  oChild);.    TRA
306e0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f  CE(("BALANCE: co
306f0 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20  py root %d into 
30700 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
30710 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  no, pChild->pgno
30720 29 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55  ));.    if( ISAU
30730 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
30740 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
30750 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67  (pBt, pChild->pg
30760 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
30770 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
30780 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30790 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
307a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
307b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
307c0 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
307d0 74 72 6d 61 70 73 28 70 43 68 69 6c 64 29 3b 0a  trmaps(pChild);.
307e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
307f0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
30800 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
30810 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  w = 0;.      }.#
30820 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
30830 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
30850 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 20 20 70  ->iPage++;.    p
30860 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 20 3d  Cur->apPage[1] =
30870 20 70 43 68 69 6c 64 3b 0a 20 20 20 20 70 43 75   pChild;.    pCu
30880 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
30890 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
308a0 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b  e_nonroot(pCur);
308b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
308c0 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
308d0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
308e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
308f0 65 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72  e page that pCur
30900 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
30910 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65  s to has just be
30920 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a  en modified in.*
30930 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73  * some way. This
30940 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65   function figure
30950 73 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f  s out if this mo
30960 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73  dification means
30970 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65   the.** tree nee
30980 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65  ds to be balance
30990 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c  d, and if so cal
309a0 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ls the appropria
309b0 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a  te balancing .**
309c0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
309d0 20 50 61 72 61 6d 65 74 65 72 20 69 73 49 6e 73   Parameter isIns
309e0 65 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61  ert is true if a
309f0 20 6e 65 77 20 63 65 6c 6c 20 77 61 73 20 6a 75   new cell was ju
30a00 73 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  st inserted into
30a10 20 74 68 65 0a 2a 2a 20 70 61 67 65 2c 20 6f 72   the.** page, or
30a20 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
30a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30a40 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72  balance(BtCursor
30a50 20 2a 70 43 75 72 2c 20 69 6e 74 20 69 73 49 6e   *pCur, int isIn
30a60 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sert){.  int rc 
30a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
30a80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
30a90 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
30aa0 72 2d 3e 69 50 61 67 65 5d 3b 0a 0a 20 20 61 73  r->iPage];..  as
30ab0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
30ac0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
30ad0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
30ae0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
30af0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
30b00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30b10 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
30b20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
30b30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
30b40 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
30b50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
30b60 61 6e 63 65 5f 64 65 65 70 65 72 28 70 43 75 72  ance_deeper(pCur
30b70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30b80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
30b90 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20  ==pPage );.     
30ba0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
30bb0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
30bc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
30bd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
30be0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
30bf0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
30c00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
30c10 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
30c20 70 43 75 72 29 3b 0a 20 20 20 20 20 20 61 73 73  pCur);.      ass
30c30 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
30c40 65 5b 30 5d 3d 3d 70 50 61 67 65 20 29 3b 0a 20  e[0]==pPage );. 
30c50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
30c60 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
30c70 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
30c80 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  K );.    }.  }el
30c90 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
30ca0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  e->nOverflow>0 |
30cb0 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 73 49  | .        (!isI
30cc0 6e 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e  nsert && pPage->
30cd0 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74  nFree>pPage->pBt
30ce0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
30cf0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
30d00 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
30d10 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
30d20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30d30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
30d40 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63  ine checks all c
30d50 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e  ursors that poin
30d60 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52  t to table pgnoR
30d70 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  oot..** If any o
30d80 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20  f those cursors 
30d90 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68  were opened with
30da0 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20   wrFlag==0 in a 
30db0 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74  different.** dat
30dc0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
30dd0 20 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e   (a database con
30de0 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61  nection that sha
30df0 72 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  res the pager.**
30e00 20 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20   cache with the 
30e10 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69  current connecti
30e20 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68  on) and that oth
30e30 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a  er connection .*
30e40 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  * is not in the 
30e50 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64  ReadUncommmitted
30e60 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69   state, then thi
30e70 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
30e80 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  s .** SQLITE_LOC
30e90 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65  KED..**.** As we
30ea0 6c 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77 69  ll as cursors wi
30eb0 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75  th wrFlag==0, cu
30ec0 72 73 6f 72 73 20 77 69 74 68 20 0a 2a 2a 20 69  rsors with .** i
30ed0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d  sIncrblobHandle=
30ee0 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73  =1 are also cons
30ef0 69 64 65 72 65 64 20 27 72 65 61 64 27 20 63 75  idered 'read' cu
30f00 72 73 6f 72 73 20 62 65 63 61 75 73 65 0a 2a 2a  rsors because.**
30f10 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
30f20 62 20 63 75 72 73 6f 72 73 20 61 72 65 20 75 73  b cursors are us
30f30 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  ed for both read
30f40 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
30f50 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f  .**.** When pgno
30f60 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74  Root is the root
30f70 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b   page of an intk
30f80 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73 20 66  ey table, this f
30f90 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a  unction is also.
30fa0 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
30fb0 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  or invalidating 
30fc0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
30fd0 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20 74 68   cursors when th
30fe0 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f  e table row.** o
30ff0 6e 20 77 68 69 63 68 20 74 68 65 79 20 61 72 65  n which they are
31000 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c 65 74   opened is delet
31010 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20  ed or modified. 
31020 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  Cursors are inva
31030 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72  lidated.** accor
31040 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ding to the foll
31050 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  owing rules:.**.
31060 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42 74 72  **   1) When Btr
31070 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 20 69  eeClearTable() i
31080 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
31090 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20 74 68  letely delete th
310a0 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20  e contents.**   
310b0 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65 20 74     of a B-Tree t
310c0 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65 20 69  able, pExclude i
310d0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e  s set to zero an
310e0 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77  d parameter iRow
310f0 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73 65 74   is .**      set
31100 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   to non-zero. In
31110 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 69   this case all i
31120 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
31130 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20  cursors open.** 
31140 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61 62 6c       on the tabl
31150 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f  e rooted at pgno
31160 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c 69 64  Root are invalid
31170 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  ated..**.**   2)
31180 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73 65 72   When BtreeInser
31190 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65 74 65  t(), BtreeDelete
311a0 28 29 20 6f 72 20 42 74 72 65 65 50 75 74 44 61  () or BtreePutDa
311b0 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ta() is called t
311c0 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66  o .**      modif
311d0 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20 76 69  y a table row vi
311e0 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  a an SQL stateme
311f0 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20  nt, pExclude is 
31200 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20  set to the .**  
31210 20 20 20 20 77 72 69 74 65 20 63 75 72 73 6f 72      write cursor
31220 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20   used to do the 
31230 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61 6e 64  modification and
31240 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20   parameter iRow 
31250 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 74  is set.**      t
31260 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f  o the integer ro
31270 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d 54 72  w id of the B-Tr
31280 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 6d  ee entry being m
31290 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a  odified. Unless.
312a0 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75 64 65  **      pExclude
312b0 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20 69 6e   is itself an in
312c0 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
312d0 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20  ursor, then all 
312e0 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20  incremental.**  
312f0 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f 72 73      blob cursors
31300 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f   open on row iRo
31310 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20  w of the B-Tree 
31320 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
31330 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66 20 62  .**.**   3) If b
31340 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61 6e 64  oth pExclude and
31350 20 69 52 6f 77 20 61 72 65 20 73 65 74 20 74 6f   iRow are set to
31360 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d   zero, no increm
31370 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20  ental blob .**  
31380 20 20 20 20 63 75 72 73 6f 72 73 20 61 72 65 20      cursors are 
31390 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
313a0 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
313b0 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  ForReadConflicts
313c0 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
313d0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
313e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
313f0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50   to check */.  P
31400 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20  gno pgnoRoot,   
31410 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66         /* Look f
31420 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  or read cursors 
31430 6f 6e 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  on this btree */
31440 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
31450 63 6c 75 64 65 2c 20 20 20 20 20 2f 2a 20 49 67  clude,     /* Ig
31460 6e 6f 72 65 20 74 68 69 73 20 63 75 72 73 6f 72  nore this cursor
31470 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 20 20   */.  i64 iRow  
31480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31490 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
314a0 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
314b0 67 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  g */.){.  BtCurs
314c0 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65  or *p;.  BtShare
314d0 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d  d *pBt = pBtree-
314e0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
314f0 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62  *db = pBtree->db
31500 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
31510 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
31520 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
31530 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
31540 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
31550 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70  t){.    if( p==p
31560 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e  Exclude ) contin
31570 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ue;.    if( p->p
31580 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f  gnoRoot!=pgnoRoo
31590 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  t ) continue;.#i
315a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
315b0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69  T_INCRBLOB.    i
315c0 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
315d0 48 61 6e 64 6c 65 20 26 26 20 28 20 0a 20 20 20  Handle && ( .   
315e0 20 20 20 20 20 20 28 21 70 45 78 63 6c 75 64 65        (!pExclude
315f0 20 26 26 20 69 52 6f 77 29 0a 20 20 20 20 20 20   && iRow).      
31600 7c 7c 20 28 70 45 78 63 6c 75 64 65 20 26 26 20  || (pExclude && 
31610 21 70 45 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63  !pExclude->isInc
31620 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 70  rblobHandle && p
31630 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f  ->info.nKey==iRo
31640 77 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20  w).    )){.     
31650 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
31660 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
31670 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
31680 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  ( p->eState!=CUR
31690 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74  SOR_VALID ) cont
316a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
316b0 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e  >wrFlag==0 .#ifn
316c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
316d0 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c  INCRBLOB.     ||
316e0 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61   p->isIncrblobHa
316f0 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  ndle.#endif.    
31700 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
31710 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70   *dbOther = p->p
31720 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
31730 20 61 73 73 65 72 74 28 64 62 4f 74 68 65 72 29   assert(dbOther)
31740 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74  ;.      if( dbOt
31750 68 65 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74  her!=db && (dbOt
31760 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  her->flags & SQL
31770 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
31780 74 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ted)==0 ){.     
31790 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
317a0 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 64 62 2c 20  tionBlocked(db, 
317b0 64 62 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20  dbOther);.      
317c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
317d0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
317e0 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  HE;.      }.    
317f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
31800 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
31810 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
31820 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
31830 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20  BTree.  The key 
31840 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65  is given by (pKe
31850 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74  y,nKey).** and t
31860 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e  he data is given
31870 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61   by (pData,nData
31880 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69  ).  The cursor i
31890 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a  s used only to.*
318a0 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61  * define what ta
318b0 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73  ble the record s
318c0 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
318d0 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72  d into.  The cur
318e0 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
318f0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
31900 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  dom location..**
31910 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45  .** For an INTKE
31920 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68  Y table, only th
31930 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20  e nKey value of 
31940 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e  the key is used.
31950 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e    pKey is.** ign
31960 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52  ored.  For a ZER
31970 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65  ODATA table, the
31980 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61   pData and nData
31990 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65   are both ignore
319a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
319b0 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d  seekResult param
319c0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
319d0 2c 20 74 68 65 6e 20 61 20 73 75 63 63 65 73 73  , then a success
319e0 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73  ful call to.** s
319f0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
31a00 6f 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72 73  o() to seek curs
31a10 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65 79  or pCur to (pKey
31a20 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72 65  , nKey) has alre
31a30 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66  ady.** been perf
31a40 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75 6c  ormed. seekResul
31a50 74 20 69 73 20 74 68 65 20 73 65 61 72 63 68 20  t is the search 
31a60 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
31a70 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e  (a negative.** n
31a80 75 6d 62 65 72 20 69 66 20 70 43 75 72 20 70 6f  umber if pCur po
31a90 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74 72 79  ints at an entry
31aa0 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72   that is smaller
31ab0 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65   than (pKey, nKe
31ac0 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69  y), or.** a posi
31ad0 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 70 43  tive value if pC
31ae0 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
31af0 65 74 72 79 20 74 68 61 74 20 69 73 20 6c 61 72  etry that is lar
31b00 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b  ger than .** (pK
31b10 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a  ey, nKey)). .**.
31b20 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  ** If the seekRe
31b30 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
31b40 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  s 0, then cursor
31b50 20 70 43 75 72 20 6d 61 79 20 70 6f 69 6e 74 20   pCur may point 
31b60 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e 74 72 79  to any .** entry
31b70 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20   or to no entry 
31b80 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68 69 73 20  at all. In this 
31b90 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
31ba0 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a  on has to seek.*
31bb0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 66  * the cursor bef
31bc0 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79 20  ore the new key 
31bd0 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64 2e  can be inserted.
31be0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
31bf0 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74  treeInsert(.  Bt
31c00 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
31c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f  Insert data into
31c30 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68   the table of th
31c40 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63  is cursor */.  c
31c50 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
31c60 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
31c70 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   The key of the 
31c80 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
31c90 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
31ca0 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f  a, int nData,  /
31cb0 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68  * The data of th
31cc0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
31cd0 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
31ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
31d00 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61  tra 0 bytes to a
31d10 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f  ppend to data */
31d20 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61  .  int appendBia
31d30 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
31d40 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
31d50 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61  s is likely an a
31d60 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73  ppend */.  int s
31d70 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20 20 20  eekResult       
31d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
31d90 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 73 71 6c  ult of prior sql
31da0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
31db0 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  ) call */.){.  i
31dc0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63  nt rc;.  int loc
31dd0 20 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20   = seekResult;. 
31de0 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e   int szNew;.  in
31df0 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
31e00 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65   *pPage;.  Btree
31e10 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
31e20 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
31e30 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
31e40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
31e50 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e  ldCell;.  unsign
31e60 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c  ed char *newCell
31e70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
31e80 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
31e90 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
31ea0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
31eb0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
31ec0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
31ed0 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
31ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
31ef0 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20  ur->wrFlag );.  
31f00 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61  rc = checkForRea
31f10 64 43 6f 6e 66 6c 69 63 74 73 28 70 43 75 72 2d  dConflicts(pCur-
31f20 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70  >pBtree, pCur->p
31f30 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e  gnoRoot, pCur, n
31f40 4b 65 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Key);.  if( rc )
31f50 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  {             . 
31f60 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
31f70 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
31f80 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
31f90 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  /.    assert( rc
31fa0 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  ==SQLITE_LOCKED_
31fb0 53 48 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20  SHAREDCACHE );. 
31fc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31fd0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
31fe0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
31ff0 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
32000 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
32010 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
32020 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
32030 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
32040 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
32050 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  e..  **.  ** In 
32060 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
32070 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
32080 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c  treeMoveto() bel
32090 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46  ow is a no-op. F
320a0 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c  or.  ** example,
320b0 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   when inserting 
320c0 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c  data into a tabl
320d0 65 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65  e with auto-gene
320e0 72 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20  rated integer.  
320f0 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42  ** keys, the VDB
32100 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20  E layer invokes 
32110 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
32120 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
32130 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67   the .  ** integ
32140 65 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49  er key to use. I
32150 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69  t then calls thi
32160 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63  s function to ac
32170 74 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68  tually insert th
32180 65 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74  e .  ** data int
32190 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54  o the intkey B-T
321a0 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
321b0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  e sqlite3BtreeMo
321c0 76 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65  veto() recognize
321d0 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  s.  ** that the 
321e0 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
321f0 79 20 77 68 65 72 65 20 69 74 20 6e 65 65 64 73  y where it needs
32200 20 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72   to be and retur
32210 6e 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  ns without.  ** 
32220 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20  doing any work. 
32230 54 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74 69  To avoid thwarti
32240 6e 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a  ng these optimiz
32250 61 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d  ations, it is im
32260 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74  portant.  ** not
32270 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75   to clear the cu
32280 72 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a  rsor here..  */.
32290 20 20 69 66 28 0a 20 20 20 20 53 51 4c 49 54 45    if(.    SQLITE
322a0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
322b0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
322c0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
322d0 43 75 72 29 29 20 7c 7c 20 28 21 6c 6f 63 20 26  Cur)) || (!loc &
322e0 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21  &.    SQLITE_OK!
322f0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  =(rc = sqlite3Bt
32300 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
32310 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65  pKey, nKey, appe
32320 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20  ndBias, &loc)). 
32330 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   )){.    return 
32340 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  rc;.  }..  pPage
32350 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
32360 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
32370 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
32380 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30  ntKey || nKey>=0
32390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
323a0 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50  age->leaf || !pP
323b0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
323c0 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
323d0 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
323e0 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
323f0 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
32400 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
32410 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
32420 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
32430 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
32440 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
32450 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
32460 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
32470 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
32480 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
32490 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
324a0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
324b0 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
324c0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
324d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
324e0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
324f0 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
32500 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
32510 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
32520 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
32530 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
32540 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
32550 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
32560 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
32570 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
32580 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
32590 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70  Bt) );.  idx = p
325a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
325b0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c  >iPage];.  if( l
325c0 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f  oc==0 && CURSOR_
325d0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
325e0 61 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73  ate ){.    u16 s
325f0 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
32600 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ( idx<pPage->nCe
32610 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll );.    rc = s
32620 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32630 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
32640 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
32650 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
32660 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nsert;.    }.   
32670 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43   oldCell = findC
32680 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
32690 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
326a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d  >leaf ){.      m
326b0 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f  emcpy(newCell, o
326c0 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20  ldCell, 4);.    
326d0 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65  }.    szOld = ce
326e0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
326f0 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72   oldCell);.    r
32700 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
32710 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
32720 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
32730 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
32740 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70   rc = dropCell(p
32750 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64  Page, idx, szOld
32760 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
32770 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
32780 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
32790 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rt;.    }.  }els
327a0 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
327b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
327c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
327d0 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
327e0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
327f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
32800 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
32810 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
32820 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
32830 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
32840 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
32850 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72  >leaf );.  }.  r
32860 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
32870 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65  Page, idx, newCe
32880 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29  ll, szNew, 0, 0)
32890 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
328a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
328b0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70  ge->nCell>0 || p
328c0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
328d0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  0 );..  /* If no
328e0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
328f0 65 64 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ed, call balance
32900 28 29 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  () to deal with 
32910 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  any overflow and
32920 0a 20 20 2a 2a 20 6d 6f 76 65 20 74 68 65 20 63  .  ** move the c
32930 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 61  ursor to point a
32940 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  t the root of th
32950 65 20 74 61 62 6c 65 20 28 73 69 6e 63 65 20 62  e table (since b
32960 61 6c 61 6e 63 65 20 6d 61 79 0a 20 20 2a 2a 20  alance may.  ** 
32970 68 61 76 65 20 72 65 61 72 72 61 6e 67 65 64 20  have rearranged 
32980 74 68 65 20 74 61 62 6c 65 20 69 6e 20 73 75 63  the table in suc
32990 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 69 6e  h a way as to in
329a0 76 61 6c 69 64 61 74 65 20 42 74 43 75 72 73 6f  validate BtCurso
329b0 72 2e 61 70 50 61 67 65 5b 5d 0a 20 20 2a 2a 20  r.apPage[].  ** 
329c0 6f 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  or BtCursor.aiId
329d0 78 5b 5d 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  x[])..  **.  ** 
329e0 45 78 63 65 70 74 2c 20 69 66 20 61 6c 6c 20 6f  Except, if all o
329f0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
32a00 61 72 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74  are true, do not
32a10 68 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hing:.  **.  ** 
32a20 20 20 2a 20 49 6e 73 65 72 74 69 6e 67 20 74 68    * Inserting th
32a30 65 20 6e 65 77 20 63 65 6c 6c 20 64 69 64 20 6e  e new cell did n
32a40 6f 74 20 63 61 75 73 65 20 6f 76 65 72 66 6c 6f  ot cause overflo
32a50 77 2c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  w,.  **.  **   *
32a60 20 42 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e   Before insertin
32a70 67 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 74  g the new cell t
32a80 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 70 6f  he cursor was po
32a90 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 0a 20  inting at the . 
32aa0 20 2a 2a 20 20 20 20 20 6c 61 72 67 65 73 74 20   **     largest 
32ab0 6b 65 79 20 69 6e 20 61 6e 20 69 6e 74 6b 65 79  key in an intkey
32ac0 20 42 2d 54 72 65 65 2c 20 61 6e 64 0a 20 20 2a   B-Tree, and.  *
32ad0 2a 0a 20 20 2a 2a 20 20 20 2a 20 54 68 65 20 6b  *.  **   * The k
32ae0 65 79 20 76 61 6c 75 65 20 61 73 73 6f 63 69 61  ey value associa
32af0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 65 77  ted with the new
32b00 20 63 65 6c 6c 20 69 73 20 6e 6f 77 20 74 68 65   cell is now the
32b10 20 6c 61 72 67 65 73 74 20 0a 20 20 2a 2a 20 20   largest .  **  
32b20 20 20 20 69 6e 20 74 68 65 20 42 2d 54 72 65 65     in the B-Tree
32b30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74  ..  **.  ** In t
32b40 68 69 73 20 63 61 73 65 20 74 68 65 20 63 75 72  his case the cur
32b50 73 6f 72 20 63 61 6e 20 62 65 20 73 61 66 65 6c  sor can be safel
32b60 79 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  y left pointing 
32b70 61 74 20 74 68 65 20 28 6e 65 77 29 20 0a 20 20  at the (new) .  
32b80 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76  ** largest key v
32b90 61 6c 75 65 20 69 6e 20 74 68 65 20 42 2d 54 72  alue in the B-Tr
32ba0 65 65 2e 20 44 6f 69 6e 67 20 73 6f 20 73 70 65  ee. Doing so spe
32bb0 65 64 73 20 75 70 20 69 6e 73 65 72 74 69 6e 67  eds up inserting
32bc0 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 66 20 65   a set.  ** of e
32bd0 6e 74 72 69 65 73 20 77 69 74 68 20 69 6e 63 72  ntries with incr
32be0 65 61 73 69 6e 67 20 69 6e 74 65 67 65 72 20 6b  easing integer k
32bf0 65 79 20 76 61 6c 75 65 73 20 76 69 61 20 61 20  ey values via a 
32c00 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 0a 20 20  single cursor.  
32c10 2a 2a 20 28 63 6f 6d 65 73 20 75 70 20 77 69 74  ** (comes up wit
32c20 68 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e  h "INSERT INTO .
32c30 2e 2e 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  .. SELECT ..." s
32c40 74 61 74 65 6d 65 6e 74 73 29 2c 20 61 73 20 0a  tatements), as .
32c50 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 69 6e    ** the next in
32c60 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 20 69  sert operation i
32c70 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
32c80 6f 20 73 65 65 6b 20 74 68 65 20 63 75 72 73 6f  o seek the curso
32c90 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
32ca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
32cb0 26 26 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72  && (pPage->nOver
32cc0 66 6c 6f 77 20 7c 7c 20 21 70 43 75 72 2d 3e 61  flow || !pCur->a
32cd0 74 4c 61 73 74 20 7c 7c 20 6c 6f 63 3e 3d 30 20  tLast || loc>=0 
32ce0 7c 7c 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65  || !pCur->apPage
32cf0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 0a 20 20 29  [0]->intKey).  )
32d00 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  {.    rc = balan
32d10 63 65 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 20  ce(pCur, 1);.   
32d20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32d30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65  OK ){.      move
32d40 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
32d50 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
32d60 4d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e  Must make sure n
32d70 4f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65  Overflow is rese
32d80 74 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69  t to zero even i
32d90 66 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a  f the balance().
32da0 20 20 2a 2a 20 66 61 69 6c 73 2e 20 20 49 6e 74    ** fails.  Int
32db0 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
32dc0 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ture corruption 
32dd0 77 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65  will result othe
32de0 72 77 69 73 65 2e 20 2a 2f 0a 20 20 70 43 75 72  rwise. */.  pCur
32df0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
32e00 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Page]->nOverflow
32e10 20 3d 20 30 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72   = 0;..end_inser
32e20 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
32e30 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
32e40 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
32e50 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
32e60 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63  nting to.  The c
32e70 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
32e80 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 61   pointing at a a
32e90 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69 6f  rbitrary locatio
32ea0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
32eb0 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43  3BtreeDelete(BtC
32ec0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
32ed0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
32ee0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
32ef0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 6e  ur->iPage];.  in
32f00 74 20 69 64 78 3b 0a 20 20 75 6e 73 69 67 6e 65  t idx;.  unsigne
32f10 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20  d char *pCell;. 
32f20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
32f30 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20  pgnoChild = 0;. 
32f40 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
32f50 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
32f60 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
32f70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
32f80 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
32f90 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
32fa0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
32fb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
32fc0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
32fd0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
32fe0 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
32ff0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69  >readOnly );.  i
33000 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
33010 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
33020 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
33030 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66  ->skip;.  }.  if
33040 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 69  ( NEVER(pCur->ai
33050 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
33060 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 20  >=pPage->nCell) 
33070 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
33080 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20  LITE_ERROR;  /* 
33090 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  The cursor is no
330a0 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  t pointing to an
330b0 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
330c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72  assert( pCur->wr
330d0 46 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d 20 63  Flag );.  rc = c
330e0 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c  heckForReadConfl
330f0 69 63 74 73 28 70 2c 20 70 43 75 72 2d 3e 70 67  icts(p, pCur->pg
33100 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43  noRoot, pCur, pC
33110 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
33120 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33130 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
33140 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
33150 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
33160 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 61 73  d lock */.    as
33170 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
33180 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
33190 43 48 45 20 29 3b 0a 20 20 20 20 72 65 74 75 72  CHE );.    retur
331a0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
331b0 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  Restore the curr
331c0 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
331d0 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20  ion (a no-op if 
331e0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
331f0 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f  t in .  ** CURSO
33200 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
33210 61 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68  ate) and save th
33220 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
33230 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
33240 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74   .  ** open on t
33250 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54  he same table. T
33260 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
33270 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
33280 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68  the page.  ** th
33290 61 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c  at the entry wil
332a0 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f  l be deleted fro
332b0 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  m..  */.  if( . 
332c0 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65     (rc = restore
332d0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
332e0 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
332f0 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
33300 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
33310 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
33320 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
33330 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33340 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
33350 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  e))!=0.  ){.    
33360 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
33370 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
33380 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20  cell within its 
33390 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70  page and leave p
333a0 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f  Cell pointing to
333b0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20   the.  ** data. 
333c0 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20  The clearCell() 
333d0 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f  call frees any o
333e0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
333f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
33400 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  e.  ** cell. The
33410 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20   cell itself is 
33420 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20  still intact..  
33430 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d  */.  idx = pCur-
33440 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
33450 67 65 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  ge];.  pCell = f
33460 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
33470 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  dx);.  if( !pPag
33480 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
33490 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
334a0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  yte(pCell);.  }.
334b0 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
334c0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
334d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
334e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
334f0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
33500 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  af ){.    /*.   
33510 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65   ** The entry we
33520 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65   are about to de
33530 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
33540 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e  af so if we do n
33550 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d  ot.    ** do som
33560 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c  ething we will l
33570 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61  eave a hole on a
33580 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e  n internal page.
33590 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20  .    ** We have 
335a0 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65  to fill the hole
335b0 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20   by moving in a 
335c0 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
335d0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65  .  The.    ** ne
335e0 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68  xt Cell after th
335f0 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65  e one to be dele
33600 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65  ted is guarantee
33610 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20  d to exist and. 
33620 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65     ** to be a le
33630 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  af so we can use
33640 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
33650 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72  BtCursor leafCur
33660 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
33670 4c 65 61 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20  LeafPage = 0;.. 
33680 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
33690 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74   *pNext;.    int
336a0 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e   notUsed;.    un
336b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
336c0 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61  pCell = 0;.    a
336d0 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 69  ssert( !pPage->i
336e0 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  ntKey );.    sql
336f0 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70  ite3BtreeGetTemp
33700 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65  Cursor(pCur, &le
33710 61 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d  afCur);.    rc =
33720 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
33730 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74  t(&leafCur, &not
33740 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
33750 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
33760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
33770 61 66 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66  afCur.aiIdx[leaf
33780 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b  Cur.iPage]==0 );
33790 0a 20 20 20 20 20 20 70 4c 65 61 66 50 61 67 65  .      pLeafPage
337a0 20 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67   = leafCur.apPag
337b0 65 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d  e[leafCur.iPage]
337c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
337d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
337e0 4c 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67  LeafPage->pDbPag
337f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
33800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33810 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 61  ){.      int lea
33820 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d  fCursorInvalid =
33830 20 30 3b 0a 20 20 20 20 20 20 75 31 36 20 73 7a   0;.      u16 sz
33840 4e 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43  Next;.      TRAC
33850 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
33860 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65  e=%d delete inte
33870 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70  rnal from %d rep
33880 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lace from leaf %
33890 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
338a0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
338b0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61  Page->pgno, pLea
338c0 66 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  fPage->pgno));. 
338d0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
338e0 61 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69  age, idx, cellSi
338f0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
33900 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  ll));.      pNex
33910 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65  t = findCell(pLe
33920 61 66 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  afPage, 0);.    
33930 20 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53    szNext = cellS
33940 69 7a 65 50 74 72 28 70 4c 65 61 66 50 61 67 65  izePtr(pLeafPage
33950 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  , pNext);.      
33960 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f  assert( MX_CELL_
33970 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78  SIZE(pBt)>=szNex
33980 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  t+4 );.      all
33990 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
339a0 42 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43  Bt);.      tempC
339b0 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  ell = pBt->pTmpS
339c0 70 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20  pace;.      if( 
339d0 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  tempCell==0 ){. 
339e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
339f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
33a00 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
33a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33a20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
33a30 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
33a40 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74   pNext-4, szNext
33a50 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29  +4, tempCell, 0)
33a60 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ;.      }...    
33a70 20 20 2f 2a 20 54 68 65 20 22 69 66 22 20 73 74    /* The "if" st
33a80 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e  atement in the n
33a90 65 78 74 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69  ext code block i
33aa0 73 20 63 72 69 74 69 63 61 6c 2e 20 20 54 68 65  s critical.  The
33ab0 0a 20 20 20 20 20 20 2a 2a 20 73 6c 69 67 68 74  .      ** slight
33ac0 65 73 74 20 65 72 72 6f 72 20 69 6e 20 74 68 61  est error in tha
33ad0 74 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c  t statement woul
33ae0 64 20 61 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74  d allow SQLite t
33af0 6f 20 6f 70 65 72 61 74 65 0a 20 20 20 20 20 20  o operate.      
33b00 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73  ** correctly mos
33b10 74 20 6f 66 20 74 68 65 20 74 69 6d 65 20 62 75  t of the time bu
33b20 74 20 70 72 6f 64 75 63 65 20 76 65 72 79 20 72  t produce very r
33b30 61 72 65 20 66 61 69 6c 75 72 65 73 2e 20 20 54  are failures.  T
33b40 6f 0a 20 20 20 20 20 20 2a 2a 20 67 75 61 72 64  o.      ** guard
33b50 20 61 67 61 69 6e 73 74 20 74 68 69 73 2c 20 74   against this, t
33b60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
33b70 72 6f 73 20 68 65 6c 70 20 74 6f 20 76 65 72 69  ros help to veri
33b80 66 79 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  fy that.      **
33b90 20 74 68 65 20 22 69 66 22 20 73 74 61 74 65 6d   the "if" statem
33ba0 65 6e 74 20 69 73 20 77 65 6c 6c 20 74 65 73 74  ent is well test
33bb0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
33bc0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
33bd0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
33be0 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
33bf0 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  <pBt->usableSize
33c00 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20  *2/3 .          
33c10 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
33c20 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
33c30 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
33c40 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
33c50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
33c60 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
33c70 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
33c80 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ==pBt->usableSiz
33c90 65 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20  e*2/3 .         
33ca0 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66          && pLeaf
33cb0 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
33cc0 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
33cd0 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20  leSize*2/3 );.  
33ce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
33cf0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
33d00 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  0 && pPage->nFre
33d10 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e==pBt->usableSi
33d20 7a 65 2a 32 2f 33 2b 31 20 0a 20 20 20 20 20 20  ze*2/3+1 .      
33d30 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c             && pL
33d40 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32  eafPage->nFree+2
33d50 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75  +szNext > pBt->u
33d60 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b  sableSize*2/3 );
33d70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
33d80 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
33d90 77 3e 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  w>0 && pPage->nF
33da0 72 65 65 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ree<=pBt->usable
33db0 53 69 7a 65 2a 32 2f 33 0a 20 20 20 20 20 20 20  Size*2/3.       
33dc0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
33dd0 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
33de0 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
33df0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
33e00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
33e10 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  (pPage->nOverflo
33e20 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e  w>0 || (pPage->n
33e30 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62  Free > pBt->usab
33e40 6c 65 53 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20  leSize*2/3)).   
33e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
33e60 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
33e70 65 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42  e+2+szNext == pB
33e80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
33e90 33 20 29 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28  3 );...      if(
33ea0 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c   (pPage->nOverfl
33eb0 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e  ow>0 || (pPage->
33ec0 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61  nFree > pBt->usa
33ed0 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29 20 26 26  bleSize*2/3)) &&
33ee0 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c 65 61  .          (pLea
33ef0 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
33f00 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61  zNext > pBt->usa
33f10 62 6c 65 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20  bleSize*2/3).   
33f20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
33f30 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
33f40 74 61 6b 65 6e 20 69 66 20 74 68 65 20 69 6e 74  taken if the int
33f50 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f  ernal node is no
33f60 77 20 65 69 74 68 65 72 20 6f 76 65 72 66 6c 6f  w either overflo
33f70 77 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  wing.        ** 
33f80 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64  or underfull and
33f90 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77   the leaf node w
33fa0 69 6c 6c 20 62 65 20 75 6e 64 65 72 66 75 6c 6c  ill be underfull
33fb0 20 61 66 74 65 72 20 74 68 65 20 6a 75 73 74 20   after the just 
33fc0 63 65 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a  cell .        **
33fd0 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 69   copied to the i
33fe0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20  nternal node is 
33ff0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 69 74 2e  deleted from it.
34000 20 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69   This is a speci
34010 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  al.        ** ca
34020 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  se because the c
34030 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29  all to balance()
34040 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20   to correct the 
34050 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20  internal node.  
34060 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 63 68 61        ** may cha
34070 6e 67 65 20 74 68 65 20 74 72 65 65 20 73 74 72  nge the tree str
34080 75 63 74 75 72 65 20 61 6e 64 20 69 6e 76 61 6c  ucture and inval
34090 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  idate the conten
340a0 74 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ts of.        **
340b0 20 74 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50   the leafCur.apP
340c0 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75  age[] and leafCu
340d0 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  r.aiIdx[] arrays
340e0 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a  , which will be.
340f0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20          ** used 
34100 62 79 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  by the balance()
34110 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 72   required to cor
34120 72 65 63 74 20 74 68 65 20 75 6e 64 65 72 66 75  rect the underfu
34130 6c 6c 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20  ll leaf.        
34140 2a 2a 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20  ** node..       
34150 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
34160 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
34170 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
34180 6e 20 61 62 6f 76 65 20 61 72 65 20 62 61 73 65  n above are base
34190 64 20 6f 6e 20 66 61 63 65 74 73 20 6f 66 0a 20  d on facets of. 
341a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
341b0 4c 69 74 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74  Lite file-format
341c0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61   that do not cha
341d0 6e 67 65 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20  nge over time.. 
341e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
341f0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
34200 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75  e->nFree==pBt->u
34210 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20  sableSize*2/3+1 
34220 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
34230 61 73 65 28 20 70 4c 65 61 66 50 61 67 65 2d 3e  ase( pLeafPage->
34240 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d  nFree+2+szNext==
34250 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
34260 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  2/3+1 );.       
34270 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c   leafCursorInval
34280 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20  id = 1;.      } 
34290 20 20 20 20 20 20 20 0a 0a 20 20 20 20 20 20 69         ..      i
342a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
342b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
342c0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
342d0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
342e0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
342f0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
34300 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
34310 28 70 50 61 67 65 2c 20 69 64 78 29 2c 20 70 67  (pPage, idx), pg
34320 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  noChild);.      
34330 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72    VVA_ONLY( pCur
34340 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
34350 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  = 0 );.        r
34360 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
34370 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
34380 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34390 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75  ITE_OK && leafCu
343a0 72 73 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20  rsorInvalid ){. 
343b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
343c0 61 66 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75  af-node is now u
343d0 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20  nderfull and so 
343e0 74 68 65 20 74 72 65 65 20 6e 65 65 64 73 20 74  the tree needs t
343f0 6f 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  o be .        **
34400 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77   rebalanced. How
34410 65 76 65 72 2c 20 74 68 65 20 62 61 6c 61 6e 63  ever, the balanc
34420 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  e() operation on
34430 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20   the internal.  
34440 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62        ** node ab
34450 6f 76 65 20 6d 61 79 20 68 61 76 65 20 6d 6f 64  ove may have mod
34460 69 66 69 65 64 20 74 68 65 20 73 74 72 75 63 74  ified the struct
34470 75 72 65 20 6f 66 20 74 68 65 20 42 2d 54 72 65  ure of the B-Tre
34480 65 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  e and.        **
34490 20 73 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   so the current 
344a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61 66  contents of leaf
344b0 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
344c0 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d   leafCur.aiIdx[]
344d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
344e0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a  not be trusted..
344f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
34500 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20     ** It is not 
34510 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 70 79  possible to copy
34520 20 74 68 65 20 61 6e 63 65 73 74 72 79 20 66 72   the ancestry fr
34530 6f 6d 20 70 43 75 72 2c 20 61 73 20 74 68 65 20  om pCur, as the 
34540 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  same.        ** 
34550 62 61 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20 68  balance() call h
34560 61 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 74  as invalidated t
34570 68 65 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  he pCur->apPage[
34580 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20  ] and aiIdx[].  
34590 20 20 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e        ** arrays.
345a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
345b0 20 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c       ** The call
345c0 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 50 6f   to saveCursorPo
345d0 73 69 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69  sition() below i
345e0 6e 74 65 72 6e 61 6c 6c 79 20 73 61 76 65 73 20  nternally saves 
345f0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
34600 6b 65 79 20 74 68 61 74 20 6c 65 61 66 43 75 72  key that leafCur
34610 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
34620 69 6e 74 69 6e 67 20 74 6f 2e 20 43 75 72 72 65  inting to. Curre
34630 6e 74 6c 79 2c 20 74 68 65 72 65 0a 20 20 20 20  ntly, there.    
34640 20 20 20 20 2a 2a 20 61 72 65 20 74 77 6f 20 63      ** are two c
34650 6f 70 69 65 73 20 6f 66 20 74 68 61 74 20 6b 65  opies of that ke
34660 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 2d 20  y in the tree - 
34670 6f 6e 65 20 68 65 72 65 20 6f 6e 20 74 68 65 20  one here on the 
34680 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  leaf.        ** 
34690 70 61 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20  page and one on 
346a0 73 6f 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  some internal no
346b0 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 20  de in the tree. 
346c0 54 68 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20  The copy on.    
346d0 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 20      ** the leaf 
346e0 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 74  node is always t
346f0 68 65 20 6e 65 78 74 20 6b 65 79 20 69 6e 20 74  he next key in t
34700 72 65 65 2d 6f 72 64 65 72 20 61 66 74 65 72 20  ree-order after 
34710 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
34720 63 6f 70 79 20 6f 6e 20 74 68 65 20 69 6e 74 65  copy on the inte
34730 72 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74  rnal node. So, t
34740 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
34750 65 33 42 74 72 65 65 4e 65 78 74 28 29 0a 20 20  e3BtreeNext().  
34760 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72        ** calls r
34770 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
34780 74 69 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20  tion() to point 
34790 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
347a0 65 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a  e copy.        *
347b0 2a 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  * stored on the 
347c0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74  internal node, t
347d0 68 65 6e 20 61 64 76 61 6e 63 65 73 20 74 6f 20  hen advances to 
347e0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a  the next entry,.
347f0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68          ** which
34800 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
34810 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b  he copy of the k
34820 65 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e  ey on the intern
34830 61 6c 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20  al node..       
34840 20 2a 2a 20 4e 65 74 20 65 66 66 65 63 74 3a 20   ** Net effect: 
34850 6c 65 61 66 43 75 72 20 69 73 20 70 6f 69 6e 74  leafCur is point
34860 69 6e 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ing back to the 
34870 64 75 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20  duplicate cell. 
34880 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6e         ** that n
34890 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 6f 76  eeds to be remov
348a0 65 64 2c 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ed, and the leaf
348b0 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
348c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 66  .        ** leaf
348d0 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61  Cur.aiIdx[] arra
348e0 79 73 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a  ys are correct..
348f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34900 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e     VVA_ONLY( Pgn
34910 6f 20 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65  o leafPgno = pLe
34920 61 66 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  afPage->pgno );.
34930 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76          rc = sav
34940 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
34950 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 20  &leafCur);.     
34960 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34970 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
34990 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72  reeNext(&leafCur
349a0 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
349b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
349c0 4c 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43  LeafPage = leafC
349d0 75 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75  ur.apPage[leafCu
349e0 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20  r.iPage];.      
349f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
34a00 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 4c 65 61 66  LITE_OK || pLeaf
34a10 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66  Page->pgno==leaf
34a20 50 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20  Pgno );.        
34a30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
34a40 54 45 5f 4f 4b 20 7c 7c 20 6c 65 61 66 43 75 72  TE_OK || leafCur
34a50 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69  .aiIdx[leafCur.i
34a60 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  Page]==0 );.    
34a70 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 53    }..      if( S
34a80 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20  QLITE_OK==rc.   
34a90 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
34aa0 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ==(rc = sqlite3P
34ab0 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 50  agerWrite(pLeafP
34ac0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 0a  age->pDbPage)) .
34ad0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
34ae0 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50   dropCell(pLeafP
34af0 61 67 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b  age, 0, szNext);
34b00 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  .        VVA_ONL
34b10 59 28 20 6c 65 61 66 43 75 72 2e 70 61 67 65 73  Y( leafCur.pages
34b20 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a  Shuffled = 0 );.
34b30 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
34b40 61 6e 63 65 28 26 6c 65 61 66 43 75 72 2c 20 30  ance(&leafCur, 0
34b50 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
34b60 74 28 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76  t( leafCursorInv
34b70 61 6c 69 64 20 7c 7c 20 21 6c 65 61 66 43 75 72  alid || !leafCur
34b80 2e 70 61 67 65 73 53 68 75 66 66 6c 65 64 0a 20  .pagesShuffled. 
34b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bb0 20 20 7c 7c 20 21 70 43 75 72 2d 3e 70 61 67 65    || !pCur->page
34bc0 73 53 68 75 66 66 6c 65 64 20 29 3b 0a 20 20 20  sShuffled );.   
34bd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
34be0 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61  qlite3BtreeRelea
34bf0 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65  seTempCursor(&le
34c00 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  afCur);.  }else{
34c10 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c  .    TRACE(("DEL
34c20 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65  ETE: table=%d de
34c30 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lete from leaf %
34c40 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75  d\n",.       pCu
34c50 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61  r->pgnoRoot, pPa
34c60 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
34c70 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50  rc = dropCell(pP
34c80 61 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69  age, idx, cellSi
34c90 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
34ca0 6c 6c 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ll));.    if( rc
34cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34cc0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
34cd0 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  e(pCur, 0);.    
34ce0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
34cf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34d00 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
34d10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
34d20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
34d30 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20  ate a new BTree 
34d40 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e  table.  Write in
34d50 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20  to *piTable the 
34d60 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
34d70 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
34d80 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
34d90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70  e..**.** The typ
34da0 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74  e of type is det
34db0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66  ermined by the f
34dc0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20  lags parameter. 
34dd0 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c   Only the.** fol
34de0 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66  lowing values of
34df0 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65   flags are curre
34e00 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74  ntly in use.  Ot
34e10 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  her values for.*
34e20 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f  * flags might no
34e30 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20  t work:.**.**   
34e40 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42    BTREE_INTKEY|B
34e50 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20  TREE_LEAFDATA   
34e60 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74    Used for SQL t
34e70 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64  ables with rowid
34e80 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52   keys.**     BTR
34e90 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20  EE_ZERODATA     
34ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
34eb0 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65  d for SQL indice
34ec0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
34ed0 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  btreeCreateTable
34ee0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
34ef0 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
34f00 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  gs){.  BtShared 
34f10 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
34f20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
34f30 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
34f40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
34f50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
34f60 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
34f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
34f80 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
34f90 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
34fa0 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
34fb0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69  >readOnly );..#i
34fc0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
34fd0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63  _AUTOVACUUM.  rc
34fe0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
34ff0 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
35000 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
35010 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
35020 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35030 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70   }.#else.  if( p
35040 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
35050 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d  {.    Pgno pgnoM
35060 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76  ove;      /* Mov
35070 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f  e a page here to
35080 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
35090 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a  he root-page */.
350a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
350b0 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70  geMove; /* The p
350c0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20  age to move to. 
350d0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  */..    /* Creat
350e0 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
350f0 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71  may probably req
35100 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65  uire moving an e
35110 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
35120 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20  .    ** to make 
35130 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77  room for the new
35140 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67   tables root pag
35150 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73 20  e. In case this 
35160 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a  page turns.    *
35170 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f  * out to be an o
35180 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65  verflow page, de
35190 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f  lete all overflo
351a0 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65  w page-map cache
351b0 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79  s.    ** held by
351c0 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20   open cursors.. 
351d0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69     */.    invali
351e0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
351f0 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20  ache(pBt);..    
35200 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75  /* Read the valu
35210 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f  e of meta[3] fro
35220 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  m the database t
35230 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72  o determine wher
35240 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  e the.    ** roo
35250 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
35260 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67  w table should g
35270 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68  o. meta[3] is th
35280 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
35290 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  age.    ** creat
352a0 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68  ed so far, so th
352b0 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
352c0 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a  is (meta[3]+1)..
352d0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
352e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
352f0 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41 52  eta(p, BTREE_LAR
35300 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20  GEST_ROOT_PAGE, 
35310 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20  &pgnoRoot);.    
35320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35330 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
35340 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
35350 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20  pgnoRoot++;..   
35360 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74   /* The new root
35370 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65  -page may not be
35380 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20   allocated on a 
35390 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
353a0 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  , or the.    ** 
353b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67  PENDING_BYTE pag
353c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  e..    */.    wh
353d0 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50  ile( pgnoRoot==P
353e0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
353f0 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20  , pgnoRoot) ||. 
35400 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d         pgnoRoot=
35410 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
35420 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
35430 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20   pgnoRoot++;.   
35440 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
35450 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20  gnoRoot>=3 );.. 
35460 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
35470 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20   page. The page 
35480 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72  that currently r
35490 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f  esides at pgnoRo
354a0 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ot will.    ** b
354b0 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61  e moved to the a
354c0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75  llocated page (u
354d0 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61  nless the alloca
354e0 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73  ted page happens
354f0 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64  .    ** to resid
35500 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a  e at pgnoRoot)..
35510 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
35520 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
35530 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76  e(pBt, &pPageMov
35540 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67  e, &pgnoMove, pg
35550 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20  noRoot, 1);.    
35560 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35570 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
35580 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
35590 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70   if( pgnoMove!=p
355a0 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  gnoRoot ){.     
355b0 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20   /* pgnoRoot is 
355c0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77 69  the page that wi
355d0 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ll be used for t
355e0 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a  he root-page of.
355f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77        ** the new
35600 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67   table (assuming
35610 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f   an error did no
35620 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65  t occur). But we
35630 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61   were.      ** a
35640 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76  llocated pgnoMov
35650 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28  e. If required (
35660 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e  i.e. if it was n
35670 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  ot allocated.   
35680 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69     ** by extendi
35690 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68  ng the file), th
356a0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61  e current page a
356b0 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d  t position pgnoM
356c0 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ove.      ** is 
356d0 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65  already journale
356e0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
356f0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
35700 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
35710 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ..      releaseP
35720 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a  age(pPageMove);.
35730 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74  .      /* Move t
35740 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  he page currentl
35750 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f  y at pgnoRoot to
35760 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20   pgnoMove. */.  
35770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35780 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
35790 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  , pgnoRoot, &pRo
357a0 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ot, 0);.      if
357b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
357c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
357d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
357e0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
357f0 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  et(pBt, pgnoRoot
35800 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
35810 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
35820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
35830 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
35840 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65  OOTPAGE || eType
35850 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
35860 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  E ){.        rel
35870 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
35880 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
35890 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
358a0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
358b0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
358c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
358d0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
358e0 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20  FREEPAGE );.    
358f0 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
35900 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20  age(pBt, pRoot, 
35910 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
35920 20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20   pgnoMove, 0);. 
35930 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
35940 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20  (pRoot);..      
35950 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61  /* Obtain the pa
35960 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a  ge at pgnoRoot *
35970 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  /.      if( rc!=
35980 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35990 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
359a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
359b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
359c0 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
359d0 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
359e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
359f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35a00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
35a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
35a20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35a30 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
35a40 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
35a50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35a60 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
35a70 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
35a80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
35a90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
35aa0 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d  e{.      pRoot =
35ab0 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20   pPageMove;.    
35ac0 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  } ..    /* Updat
35ad0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  e the pointer-ma
35ae0 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20  p and meta-data 
35af0 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f  with the new roo
35b00 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a  t-page number. *
35b10 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  /.    rc = ptrma
35b20 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f  pPut(pBt, pgnoRo
35b30 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  ot, PTRMAP_ROOTP
35b40 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
35b50 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c   rc ){.      rel
35b60 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
35b70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
35b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
35b90 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
35ba0 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67  ateMeta(p, 4, pg
35bb0 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28  noRoot);.    if(
35bc0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c   rc ){.      rel
35bd0 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
35be0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
35bf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
35c00 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  {.    rc = alloc
35c10 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
35c20 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52  , &pRoot, &pgnoR
35c30 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  oot, 1, 0);.    
35c40 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
35c50 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rc;.  }.#endif. 
35c60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35c70 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
35c80 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
35c90 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   );.  zeroPage(p
35ca0 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54  Root, flags | PT
35cb0 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74  F_LEAF);.  sqlit
35cc0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f  e3PagerUnref(pRo
35cd0 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
35ce0 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29  *piTable = (int)
35cf0 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75  pgnoRoot;.  retu
35d00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
35d10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
35d20 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65  CreateTable(Btre
35d30 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62  e *p, int *piTab
35d40 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
35d50 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
35d60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
35d70 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 72  ;.  rc = btreeCr
35d80 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54  eateTable(p, piT
35d90 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  able, flags);.  
35da0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
35db0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
35dc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  c;.}../*.** Eras
35dd0 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  e the given data
35de0 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c  base page and al
35df0 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20  l its children. 
35e00 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70   Return.** the p
35e10 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
35e20 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
35e30 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65  nt clearDatabase
35e40 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
35e50 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
35e60 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68   /* The BTree th
35e70 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
35e80 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  table */.  Pgno 
35e90 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
35ea0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
35eb0 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69 6e  to clear */.  in
35ec0 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c 20  t freePageFlag, 
35ed0 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
35ee0 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a  e page if true *
35ef0 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67  /.  int *pnChang
35f00 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e.){.  MemPage *
35f10 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
35f20 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
35f30 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69  char *pCell;.  i
35f40 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
35f50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
35f60 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
35f70 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61  );.  if( pgno>pa
35f80 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
35f90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
35fa0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
35fb0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  KPT;.  }..  rc =
35fc0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
35fd0 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67  pBt, pgno, &pPag
35fe0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
35ff0 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
36000 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72  epage_out;.  for
36010 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
36020 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
36030 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
36040 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
36050 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
36060 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63   ){.      rc = c
36070 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
36080 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
36090 43 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e  Cell), 1, pnChan
360a0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
360b0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
360c0 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
360d0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
360e0 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
360f0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
36100 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
36110 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
36120 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
36130 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
36140 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
36150 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
36160 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
36170 61 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61 6e  a[8]), 1, pnChan
36180 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
36190 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
361a0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
361b0 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61 6e  }else if( pnChan
361c0 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
361d0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
361e0 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65  );.    *pnChange
361f0 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   += pPage->nCell
36200 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65  ;.  }.  if( free
36210 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  PageFlag ){.    
36220 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
36230 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  age);.  }else if
36240 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
36250 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
36260 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b  >pDbPage))==0 ){
36270 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
36280 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  age, pPage->aDat
36290 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29  a[0] | PTF_LEAF)
362a0 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61  ;.  }..cleardata
362b0 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  basepage_out:.  
362c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
362d0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
362e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
362f0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
36300 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74   from a single t
36310 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
36320 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73  base.  iTable is
36330 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
36340 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  ber of the root 
36350 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41  of the table.  A
36360 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
36370 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68  e returns,.** th
36380 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
36390 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20  mpty, but still 
363a0 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
363b0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
363c0 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
363d0 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
363e0 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
363f0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e   read cursors on
36400 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65   the table.  Ope
36410 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  n write cursors 
36420 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
36430 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  .** root of the 
36440 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
36450 70 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20  pnChange is not 
36460 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65  NULL, then table
36470 20 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20   iTable must be 
36480 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e  an intkey table.
36490 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   The.** integer 
364a0 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f  value pointed to
364b0 20 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20   by pnChange is 
364c0 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74  incremented by t
364d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
364e0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74  entries in the t
364f0 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
36500 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
36510 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
36520 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
36530 6e 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20  nChange){.  int 
36540 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
36550 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
36560 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
36570 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
36580 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
36590 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
365a0 20 28 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52   (rc = checkForR
365b0 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
365c0 69 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d  iTable, 0, 1))!=
365d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
365e0 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   /* nothing to d
365f0 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  o */.  }else if(
36600 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
36610 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
36620 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29  (pBt, iTable, 0)
36630 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68  ) ){.    /* noth
36640 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d  ing to do */.  }
36650 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63  else{.    rc = c
36660 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
36670 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
36680 6c 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65 29  le, 0, pnChange)
36690 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
366a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
366b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
366c0 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e  .** Erase all in
366d0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74  formation in a t
366e0 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65  able and add the
366f0 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
36700 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65  le to.** the fre
36710 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20  elist.  Except, 
36720 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
36730 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20  principle table 
36740 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70  (the one on.** p
36750 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20  age 1) is never 
36760 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
36770 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  elist..**.** Thi
36780 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
36790 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
367a0 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
367b0 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
367c0 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
367d0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41  able..**.** If A
367e0 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61  UTOVACUUM is ena
367f0 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  bled and the pag
36800 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e  e at iTable is n
36810 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72  ot the last.** r
36820 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
36830 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
36840 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f  hen the last roo
36850 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68  t page .** in th
36860 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36870 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68  is moved into th
36880 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20  e slot formerly 
36890 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69  occupied by.** i
368a0 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c  Table and that l
368b0 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  ast slot formerl
368c0 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68  y occupied by th
368d0 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
368e0 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
368f0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73  the freelist ins
36900 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20  tead of iTable. 
36910 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c   In this say, al
36920 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20  l.** root pages 
36930 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20  are kept at the 
36940 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
36950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
36960 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65  which.** is nece
36970 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41  ssary for AUTOVA
36980 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67  CUUM to work rig
36990 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73  ht.  *piMoved is
369a0 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20   set to the .** 
369b0 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
369c0 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20   used to be the 
369d0 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69  last root page i
369e0 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72  n the file befor
369f0 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20  e.** the move.  
36a00 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20  If no page gets 
36a10 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20  moved, *piMoved 
36a20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20  is set to 0..** 
36a30 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  The last root pa
36a40 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ge is recorded i
36a50 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68  n meta[3] and th
36a60 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65  e value of.** me
36a70 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64  ta[3] is updated
36a80 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75   by this procedu
36a90 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
36aa0 74 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65  t btreeDropTable
36ab0 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
36ac0 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d  iTable, int *piM
36ad0 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
36ae0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
36af0 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  e = 0;.  BtShare
36b00 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
36b10 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
36b20 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
36b30 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
36b40 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
36b50 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20  RANS_WRITE );.. 
36b60 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61   /* It is illega
36b70 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c  l to drop a tabl
36b80 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
36b90 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
36ba0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
36bb0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
36bc0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
36bd0 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20  ode the backend 
36be0 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f  may.  ** need to
36bf0 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f   move another ro
36c00 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20  ot-page to fill 
36c10 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68  a gap left by th
36c20 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72  e deleted.  ** r
36c30 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20  oot page. If an 
36c40 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20  open cursor was 
36c50 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  using this page 
36c60 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20  a problem would 
36c70 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a  .  ** occur..  *
36c80 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75  /.  if( pBt->pCu
36c90 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
36ca0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
36cb0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d  cked(p->db, pBt-
36cc0 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65  >pCursor->pBtree
36cd0 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  ->db);.    retur
36ce0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  n SQLITE_LOCKED_
36cf0 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
36d00 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
36d10 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
36d20 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20  , (Pgno)iTable, 
36d30 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  &pPage, 0);.  if
36d40 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
36d50 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
36d60 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
36d70 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  p, iTable, 0);. 
36d80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
36d90 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
36da0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
36db0 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65  ;.  }..  *piMove
36dc0 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54  d = 0;..  if( iT
36dd0 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66  able>1 ){.#ifdef
36de0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36df0 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d  OVACUUM.    rc =
36e00 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
36e10 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
36e20 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a  e(pPage);.#else.
36e30 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
36e40 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
36e50 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e   Pgno maxRootPgn
36e60 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
36e70 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
36e80 61 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45  a(p, BTREE_LARGE
36e90 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 6d  ST_ROOT_PAGE, &m
36ea0 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
36eb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36ec0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36ed0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
36ee0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
36ef0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
36f00 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65        if( iTable
36f10 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b  ==maxRootPgno ){
36f20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
36f30 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
36f40 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61  ropped is the ta
36f50 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  ble with the lar
36f60 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
36f70 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
36f80 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
36f90 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70  , put the root p
36fa0 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20  age on the free 
36fb0 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
36fc0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  /.        rc = f
36fd0 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
36fe0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
36ff0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
37000 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37020 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
37040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
37050 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
37060 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74  dropped does not
37070 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73   have the larges
37080 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
37090 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
370a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53   the database. S
370b0 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  o move the page 
370c0 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74  that does into t
370d0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  he .        ** g
370e0 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64  ap left by the d
370f0 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65  eleted root-page
37100 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
37110 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d       MemPage *pM
37120 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ove;.        rel
37130 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
37140 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
37150 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
37160 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
37170 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a  no, &pMove, 0);.
37180 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
37190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
371a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
371b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
371c0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
371d0 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65  ePage(pBt, pMove
371e0 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
371f0 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30 29  E, 0, iTable, 0)
37200 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
37210 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
37220 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37240 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37260 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
37270 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
37280 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
37290 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
372a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
372b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
372c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
372d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
372e0 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65  = freePage(pMove
372f0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
37300 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
37310 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37320 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37330 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37350 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61     *piMoved = ma
37360 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
37370 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
37380 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f   the new 'max-ro
37390 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69  ot-page' value i
373a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
373b0 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20  eader. This.    
373c0 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20    ** is the old 
373d0 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20  value less one, 
373e0 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66  less one more if
373f0 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f   that happens to
37400 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72  .      ** be a r
37410 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c  oot-page number,
37420 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20   less one again 
37430 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  if that is the. 
37440 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f       ** PENDING_
37450 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20  BYTE_PAGE..     
37460 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f   */.      maxRoo
37470 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69  tPgno--;.      i
37480 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
37490 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
374a0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
374b0 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
374c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
374d0 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
374e0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
374f0 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20  t, maxRootPgno) 
37500 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
37510 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
37520 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
37530 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e  maxRootPgno!=PEN
37540 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
37550 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63  Bt) );..      rc
37560 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
37570 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
37580 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
37590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
375a0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
375b0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ge);.      relea
375c0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
375d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65     }.#endif.  }e
375e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73  lse{.    /* If s
375f0 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
37600 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20  able was called 
37610 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
37620 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
37630 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
37640 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c  _LEAF );.    rel
37650 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
37660 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
37670 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ;  .}.int sqlite
37680 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
37690 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
376a0 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76  able, int *piMov
376b0 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
376c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
376d0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
376e0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20  reeDropTable(p, 
376f0 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29  iTable, piMoved)
37700 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
37710 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
37720 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
37730 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69   Read the meta-i
37740 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f  nformation out o
37750 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
37760 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69  e.  Meta[0].** i
37770 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
37780 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65  free pages curre
37790 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntly in the data
377a0 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a  base.  Meta[1].*
377b0 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31  * through meta[1
377c0 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  5] are available
377d0 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68   for use by high
377e0 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61  er layers.  Meta
377f0 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f  [0].** is read-o
37800 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20  nly, the others 
37810 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a  are read/write..
37820 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  ** .** The schem
37830 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20  a layer numbers 
37840 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66  meta values diff
37850 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65  erently.  At the
37860 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72   schema.** layer
37870 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f   (and the SetCoo
37880 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b  kie and ReadCook
37890 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20  ie opcodes) the 
378a0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65  number of.** fre
378b0 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76  e pages is not v
378c0 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b  isible.  So Cook
378d0 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d  ie[0] is the sam
378e0 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f  e as Meta[1]..*/
378f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
37900 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a  eGetMeta(Btree *
37910 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
37920 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67  *pMeta){.  DbPag
37930 65 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b 0a  e *pDbPage = 0;.
37940 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
37950 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a  gned char *pP1;.
37960 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
37970 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
37980 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
37990 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67  );..  /* Reading
379a0 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c   a meta-data val
379b0 75 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65  ue requires a re
379c0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
379d0 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a  1 (and hence.  *
379e0 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
379f0 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72  ter table. We gr
37a00 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67  ab this lock reg
37a10 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
37a20 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74  er or.  ** not t
37a30 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  he SQLITE_ReadUn
37a40 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
37a50 73 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65  s set (the table
37a60 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a   rooted at page.
37a70 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65    ** 1 is treate
37a80 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  d as a special c
37a90 61 73 65 20 62 79 20 71 75 65 72 79 53 68 61 72  ase by queryShar
37aa0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
37ab0 28 29 0a 20 20 2a 2a 20 61 6e 64 20 73 65 74 53  ().  ** and setS
37ac0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
37ad0 6f 63 6b 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72  ock())..  */.  r
37ae0 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
37af0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
37b00 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
37b10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
37b30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
37b40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
37b50 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69    }..  assert( i
37b60 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35  dx>=0 && idx<=15
37b70 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   );.  if( pBt->p
37b80 50 61 67 65 31 20 29 7b 0a 20 20 20 20 2f 2a 20  Page1 ){.    /* 
37b90 54 68 65 20 62 2d 74 72 65 65 20 69 73 20 61 6c  The b-tree is al
37ba0 72 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61 20  ready holding a 
37bb0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
37bc0 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
37bd0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ase.    ** file.
37be0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
37bf0 65 20 72 65 71 75 69 72 65 64 20 6d 65 74 61 2d  e required meta-
37c00 64 61 74 61 20 76 61 6c 75 65 20 63 61 6e 20 62  data value can b
37c10 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 0a  e read directly.
37c20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
37c30 70 61 67 65 20 64 61 74 61 20 6f 66 20 74 68 69  page data of thi
37c40 73 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69  s reference. Thi
37c50 73 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  s is slightly fa
37c60 73 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a  ster than.    **
37c70 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 6e 65   requesting a ne
37c80 77 20 72 65 66 65 72 65 6e 63 65 20 66 72 6f 6d  w reference from
37c90 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
37ca0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 31  ..    */.    pP1
37cb0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
37cc0 72 20 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  r *)pBt->pPage1-
37cd0 3e 61 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b  >aData;.  }else{
37ce0 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74 72  .    /* The b-tr
37cf0 65 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ee does not have
37d00 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
37d10 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  page 1 of the da
37d20 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
37d30 20 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e 65 20 66   ** Obtain one f
37d40 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
37d50 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  yer..    */.    
37d60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37d70 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
37d80 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , 1, &pDbPage);.
37d90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
37da0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
37db0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
37dc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
37dd0 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73 69  .    pP1 = (unsi
37de0 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
37df0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
37e00 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
37e10 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74  *pMeta = get4byt
37e20 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
37e30 34 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  4]);..  /* If th
37e40 65 20 62 2d 74 72 65 65 20 69 73 20 6e 6f 74 20  e b-tree is not 
37e50 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
37e60 6e 63 65 20 74 6f 20 70 61 67 65 20 31 2c 20 74  nce to page 1, t
37e70 68 65 6e 20 6f 6e 65 20 77 61 73 20 0a 20 20 2a  hen one was .  *
37e80 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
37e90 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
37ea0 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 62 6c   in the above bl
37eb0 6f 63 6b 2e 20 52 65 6c 65 61 73 65 20 69 74 20  ock. Release it 
37ec0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
37ed0 21 70 42 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a  !pBt->pPage1 ){.
37ee0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
37ef0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
37f00 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74    }..  /* If aut
37f10 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69 73  ovacuumed is dis
37f20 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
37f30 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20 74  ild but we are t
37f40 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61  rying to .  ** a
37f50 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63  ccess an autovac
37f60 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20  uumed database, 
37f70 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61  then make the da
37f80 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e  tabase readonly.
37f90 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   .  */.#ifdef SQ
37fa0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
37fb0 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d  CUUM.  if( idx==
37fc0 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f  BTREE_LARGEST_RO
37fd0 4f 54 5f 50 41 47 45 20 26 26 20 2a 70 4d 65 74  OT_PAGE && *pMet
37fe0 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f  a>0 ) pBt->readO
37ff0 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  nly = 1;.#endif.
38000 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
38010 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 6f  s currently an o
38020 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
38030 20 67 72 61 62 20 61 20 72 65 61 64 2d 6c 6f 63   grab a read-loc
38040 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
38050 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
38060 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
38070 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
38080 65 20 74 68 61 74 0a 20 20 2a 2a 20 6e 6f 20 6f  e that.  ** no o
38090 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
380a0 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6d  can modify the m
380b0 65 74 61 20 76 61 6c 75 65 20 6a 75 73 74 20 72  eta value just r
380c0 65 61 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ead from.  ** th
380d0 65 20 64 61 74 61 62 61 73 65 20 75 6e 74 69 6c  e database until
380e0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
380f0 20 69 73 20 63 6f 6e 63 6c 75 64 65 64 2e 0a 20   is concluded.. 
38100 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
38110 72 61 6e 73 3e 30 20 29 7b 0a 20 20 20 20 72 63  rans>0 ){.    rc
38120 20 3d 20 73 65 74 53 68 61 72 65 64 43 61 63 68   = setSharedCach
38130 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c  eTableLock(p, 1,
38140 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d   READ_LOCK);.  }
38150 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
38160 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
38170 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
38180 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d  rite meta-inform
38190 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20  ation back into 
381a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
381b0 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61  eta[0] is.** rea
381c0 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e  d-only and may n
381d0 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a  ot be written..*
381e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
381f0 65 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72  eeUpdateMeta(Btr
38200 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ee *p, int idx, 
38210 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74  u32 iMeta){.  Bt
38220 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
38230 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
38240 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e   char *pP1;.  in
38250 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
38260 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31  idx>=1 && idx<=1
38270 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
38280 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
38290 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
382a0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
382b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
382c0 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20  >pPage1!=0 );.  
382d0 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
382e0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
382f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
38300 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
38310 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
38320 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
38330 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
38340 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20  P1[36 + idx*4], 
38350 69 4d 65 74 61 29 3b 0a 23 69 66 6e 64 65 66 20  iMeta);.#ifndef 
38360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
38370 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 69  VACUUM.    if( i
38380 64 78 3d 3d 42 54 52 45 45 5f 49 4e 43 52 5f 56  dx==BTREE_INCR_V
38390 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 61  ACUUM ){.      a
383a0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
383b0 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d  Vacuum || iMeta=
383c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
383d0 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20  rt( iMeta==0 || 
383e0 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20  iMeta==1 );.    
383f0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
38400 6d 20 3d 20 28 75 38 29 69 4d 65 74 61 3b 0a 20  m = (u8)iMeta;. 
38410 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
38420 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
38430 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
38440 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
38450 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79  turn the flag by
38460 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  te at the beginn
38470 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20  ing of the page 
38480 74 68 61 74 20 74 68 65 20 63 75 72