/ Hex Artifact Content
Login

Artifact 732191303402ec6ab0dd7062d07a4bb6a6c51c0c:


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 33 39 20 32 30 30 39 2f 30  c,v 1.639 2009/0
0190: 36 2f 32 33 20 31 31 3a 32 32 3a 32 39 20 64 61  6/23 11:22:29 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f....#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  CACHE./*.** A li
0450: 73 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f  st of BtShared o
0460: 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20  bjects that are 
0470: 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72  eligible for par
0480: 74 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e  ticipation.** in
0490: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
04a0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61  This variable ha
04b0: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72  s file scope dur
04c0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  ing normal build
04d0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65  s,.** but the te
04e0: 73 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73  st harness needs
04f0: 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f   to access it so
0500: 20 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62   we make it glob
0510: 61 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20  al for .** test 
0520: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63  builds..**.** Ac
0530: 63 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72  cess to this var
0540: 69 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74  iable is protect
0550: 65 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54  ed by SQLITE_MUT
0560: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
0570: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0580: 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64  TE_TEST.BtShared
0590: 20 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c   *SQLITE_WSD sql
05a0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
05b0: 69 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ist = 0;.#else.s
05c0: 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a  tatic BtShared *
05d0: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
05e0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05f0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  t = 0;.#endif.#e
0600: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0610: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0620: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0630: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0640: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0650: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0660: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0670: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0680: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0690: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
06a0: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06c0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06d0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06e0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06f0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
0700: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0710: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0720: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0730: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0740: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0750: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0760: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0770: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0780: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0790: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
07a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
07b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
07c0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
07d0: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
07e0: 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 52 65 61   int checkForRea
07f0: 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65  dConflicts(Btree
0800: 2a 2c 20 50 67 6e 6f 2c 20 42 74 43 75 72 73 6f  *, Pgno, BtCurso
0810: 72 2a 2c 20 69 36 34 29 3b 0a 0a 0a 23 69 66 64  r*, i64);...#ifd
0820: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0830: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0840: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0850: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0860: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0870: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0880: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0890: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
08a0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
08b0: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
08c0: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
08d0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
08e0: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
08f0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0900: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0910: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0920: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0930: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0940: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0950: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0960: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0970: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0980: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0990: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
09a0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
09b0: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
09c0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
09d0: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
09e0: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
09f0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0a00: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0a10: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0a20: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0a30: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0a40: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0a50: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0a60: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0a70: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0a80: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0a90: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 23  eTableLocks(a).#
0aa0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0ab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ac0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51 75  D_CACHE./*.** Qu
0ad0: 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 74  ery to see if bt
0ae0: 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79  ree handle p may
0af0: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
0b00: 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a  f type eLock .**
0b10: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
0b20: 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68  RITE_LOCK) on th
0b30: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
0b40: 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74  t-page iTab. Ret
0b50: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
0b60: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79   if the lock may
0b70: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79   be obtained (by
0b80: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53   calling.** setS
0b90: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ba0: 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54  ock()), or SQLIT
0bb0: 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e  E_LOCKED if not.
0bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71  .*/.static int q
0bd0: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
0bf0: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
0c00: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
0c10: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
0c20: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
0c30: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
0c40: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
0c50: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
0c60: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
0c70: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
0c80: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
0c90: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
0ca0: 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
0cb0: 72 65 71 75 65 73 74 69 6e 67 20 61 20 77 72 69  requesting a wri
0cc0: 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  te-lock, then th
0cd0: 65 20 42 74 72 65 65 20 6d 75 73 74 20 68 61 76  e Btree must hav
0ce0: 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a  e an open write.
0cf0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
0d00: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41   on this file. A
0d10: 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66  nd, obviously, f
0d20: 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f  or this to be so
0d30: 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73   there .  ** mus
0d40: 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  t be an open wri
0d50: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
0d60: 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  n the file itsel
0d70: 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  f..  */.  assert
0d80: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
0d90: 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70  CK || (p==pBt->p
0da0: 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54  Writer && p->inT
0db0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
0dc0: 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
0dd0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
0de0: 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
0df0: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
0e00: 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  ITE );.  .  /* T
0e10: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
0e20: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  f the shared-cac
0e30: 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  he is not enable
0e40: 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73  d */.  if( !p->s
0e50: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72  harable ){.    r
0e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0e70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  .  }..  /* If so
0e80: 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
0e90: 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ion is holding a
0ea0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
0eb0: 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65  , the.  ** reque
0ec0: 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f  sted lock may no
0ed0: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20  t be obtained.. 
0ee0: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   */.  if( pBt->p
0ef0: 57 72 69 74 65 72 21 3d 70 20 26 26 20 70 42 74  Writer!=p && pBt
0f00: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ->isExclusive ){
0f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
0f20: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
0f30: 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65  >db, pBt->pWrite
0f40: 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  r->db);.    retu
0f50: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
0f60: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
0f70: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61 6c  }..  /* This (al
0f80: 6f 6e 67 20 77 69 74 68 20 73 65 74 53 68 61 72  ong with setShar
0f90: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0fa0: 28 29 29 20 69 73 20 77 68 65 72 65 0a 20 20 2a  ()) is where.  *
0fb0: 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  * the ReadUncomm
0fc0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 64 65  itted flag is de
0fd0: 61 6c 74 20 77 69 74 68 2e 0a 20 20 2a 2a 20 49  alt with..  ** I
0fe0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
0ff0: 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72  querying for a r
1000: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 61 6e 79 20  ead-lock on any 
1010: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 74 68 65 72  table.  ** other
1020: 20 74 68 61 6e 20 74 68 65 20 73 71 6c 69 74 65   than the sqlite
1030: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 74  _master table (t
1040: 61 62 6c 65 20 31 29 20 61 6e 64 20 69 66 20 74  able 1) and if t
1050: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
1060: 65 64 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  ed.  ** flag is 
1070: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  set, then the lo
1080: 63 6b 20 67 72 61 6e 74 65 64 20 65 76 65 6e 20  ck granted even 
1090: 69 66 20 74 68 65 72 65 20 61 72 65 20 77 72 69  if there are wri
10a0: 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e  te-locks.  ** on
10b0: 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61   the table. If a
10c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72   write-lock is r
10d0: 65 71 75 65 73 74 65 64 2c 20 74 68 65 20 52 65  equested, the Re
10e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
10f0: 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63  ag.  ** is not c
1100: 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a  onsidered..  **.
1110: 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e    ** In function
1120: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
1130: 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 69 66 20 61  ableLock(), if a
1140: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65   read-lock is de
1150: 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65 20 0a  manded and the .
1160: 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69    ** ReadUncommi
1170: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
1180: 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 61 64  , no entry is ad
1190: 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73  ded to the locks
11a0: 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42 74 53   list .  ** (BtS
11b0: 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20  hared.pLock)..  
11c0: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61  **.  ** To summa
11d0: 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52 65 61  rize: If the Rea
11e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
11f0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72  g is set, then r
1200: 65 61 64 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ead cursors.  **
1210: 20 6f 6e 20 6e 6f 6e 2d 73 63 68 65 6d 61 20 74   on non-schema t
1220: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 63 72 65  ables do not cre
1230: 61 74 65 20 6f 72 20 72 65 73 70 65 63 74 20 74  ate or respect t
1240: 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20  able locks. The 
1250: 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 70 72 6f  locking.  ** pro
1260: 63 65 64 75 72 65 20 66 6f 72 20 61 20 77 72 69  cedure for a wri
1270: 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e  te-cursor does n
1280: 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  ot change..  */.
1290: 20 20 69 66 28 20 0a 20 20 20 20 30 3d 3d 28 70    if( .    0==(p
12a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
12b0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
12c0: 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63  ed) || .    eLoc
12d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
12e0: 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45  .    iTab==MASTE
12f0: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1300: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1310: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1320: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1330: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
1340: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
1350: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
1360: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1370: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 20 20 2a  if(...) .      *
1380: 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  * statement is a
1390: 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
13a0: 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  of:.      **.   
13b0: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
13c0: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
13d0: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
13e0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 2a 2a  E_LOCK).      **
13f0: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20  .      ** since 
1400: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20  we know that if 
1410: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1420: 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72  K, then no other
1430: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
1440: 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20    ** may hold a 
1450: 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e  WRITE_LOCK on an
1460: 79 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20  y table in this 
1470: 66 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72  file (since ther
1480: 65 20 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  e can.      ** o
1490: 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20  nly be a single 
14a0: 77 72 69 74 65 72 29 2e 0a 20 20 20 20 20 20 2a  writer)..      *
14b0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
14c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
14d0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
14e0: 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ->eLock==WRITE_L
14f0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
1500: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
1510: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
1520: 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74  pBtree==p || pIt
1530: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
1540: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
1550: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
1560: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
1570: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
1580: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
1590: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15a0: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
15b0: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
15c0: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
15d0: 20 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b         if( eLock
15e0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a  ==WRITE_LOCK ){.
15f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1600: 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65  ( p==pBt->pWrite
1610: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
1620: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
1630: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1640: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1650: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1660: 43 41 43 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20  CACHE;.      }. 
1670: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1680: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1690: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
16a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16b0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
16c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16d0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
16e0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
16f0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1700: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
1710: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
1720: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
1730: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
1740: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
1750: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
1760: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
1770: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
1780: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1790: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
17a0: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
17b0: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53  ully. SQLITE_BUS
17c0: 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  Y and.** SQLITE_
17d0: 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62  NOMEM may also b
17e0: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  e returned..*/.s
17f0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61  tatic int setSha
1800: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1810: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
1820: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1830: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1840: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1850: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
1860: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
1870: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
1880: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1890: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
18a0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
18b0: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
18c0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
18d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
18e0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  0 );..  /* This 
18f0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1900: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1910: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1920: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1930: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1950: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
1960: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
1970: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1980: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
1990: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  k) );..  /* If t
19a0: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
19b0: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
19c0: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
19d0: 69 73 20 72 65 71 75 65 73 74 65 64 20 6f 6e 0a  is requested on.
19e0: 20 20 2a 2a 20 61 20 6e 6f 6e 2d 73 63 68 65 6d    ** a non-schem
19f0: 61 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  a table, then th
1a00: 65 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  e lock is always
1a10: 20 67 72 61 6e 74 65 64 2e 20 20 52 65 74 75 72   granted.  Retur
1a20: 6e 20 65 61 72 6c 79 0a 20 20 2a 2a 20 77 69 74  n early.  ** wit
1a30: 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65  hout adding an e
1a40: 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74 53 68  ntry to the BtSh
1a50: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e  ared.pLock list.
1a60: 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e   See.  ** commen
1a70: 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75  t in function qu
1a80: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1a90: 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f  bleLock() for mo
1aa0: 72 65 20 69 6e 66 6f 0a 20 20 2a 2a 20 6f 6e 20  re info.  ** on 
1ab0: 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 52 65 61  handling the Rea
1ac0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
1ad0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
1ae0: 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73     (p->db->flags
1af0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1b00: 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20 20 20  mmitted) && .   
1b10: 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f   (eLock==READ_LO
1b20: 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c  CK) &&.    iTabl
1b30: 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  e!=MASTER_ROOT. 
1b40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1b50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1b60: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
1b70: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
1b80: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
1b90: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
1ba0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1bb0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1bc0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1bd0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
1be0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
1bf0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
1c00: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
1c10: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
1c20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c30: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1c40: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
1c50: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
1c60: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
1c70: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
1c80: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
1c90: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
1ca0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
1cb0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
1cc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
1cd0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
1ce0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
1cf0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
1d00: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
1d10: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
1d20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d40: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
1d50: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
1d60: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
1d70: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
1d80: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
1d90: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
1da0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
1db0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
1dc0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
1dd0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
1de0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
1df0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
1e00: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1e10: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
1e20: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
1e30: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
1e40: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
1e50: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
1e60: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
1e70: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
1e80: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
1e90: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
1ea0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
1eb0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
1ec0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
1ed0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
1ee0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
1ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f00: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
1f10: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1f20: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
1f30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1f40: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
1f50: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
1f60: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
1f70: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
1f80: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
1f90: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1fa0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
1fb0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
1fc0: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2a 0a  ee handle p..**.
1fd0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1fe0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 68 61   assumes that ha
1ff0: 6e 64 6c 65 20 70 20 68 61 73 20 61 6e 20 6f 70  ndle p has an op
2000: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
2010: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
2020: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
2030: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 53 68 61  , then the BtSha
2040: 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 76 61  red.isPending va
2050: 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65  riable.** may be
2060: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c 65   incorrectly cle
2070: 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
2080: 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68 61  void clearAllSha
2090: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
20a0: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
20b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20c0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b  p->pBt;.  BtLock
20d0: 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42 74   **ppIter = &pBt
20e0: 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65  ->pLock;..  asse
20f0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2100: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2110: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2120: 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70  arable || 0==*pp
2130: 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  Iter );.  assert
2140: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29  ( p->inTrans>0 )
2150: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49  ;..  while( *ppI
2160: 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  ter ){.    BtLoc
2170: 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74  k *pLock = *ppIt
2180: 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
2190: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
21a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
21b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
21c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
21d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
21e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
21f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
2200: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
2210: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
2220: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
2230: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
2240: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
2250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2260: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
2270: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
2280: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  }..  assert( pBt
2290: 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20 7c  ->isPending==0 |
22a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
22b0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
22c0: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
22d0: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
22e0: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
22f0: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
2300: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
2310: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
2320: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
2330: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
2340: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2350: 61 6c 6c 65 64 20 77 68 65 6e 20 63 6f 6e 6e 65  alled when conne
2360: 63 74 69 6f 6e 20 70 20 69 73 20 63 6f 6e 63 6c  ction p is concl
2370: 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a  uding its .    *
2380: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2390: 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c  f there currentl
23a0: 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65  y exists a write
23b0: 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a  r, and p is not.
23c0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74      ** that writ
23d0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  er, then the num
23e0: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
23f0: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
2400: 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68   other.    ** th
2410: 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75  an the writer mu
2420: 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64  st be about to d
2430: 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  rop to zero. In 
2440: 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a  this case.    **
2450: 20 73 65 74 20 74 68 65 20 69 73 50 65 6e 64 69   set the isPendi
2460: 6e 67 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20  ng flag to 0..  
2470: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2480: 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72  here is not curr
2490: 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20  ently a writer, 
24a0: 74 68 65 6e 20 42 74 53 68 61 72 65 64 2e 69 73  then BtShared.is
24b0: 50 65 6e 64 69 6e 67 20 6d 75 73 74 0a 20 20 20  Pending must.   
24c0: 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65   ** be zero alre
24d0: 61 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78  ady. So this nex
24e0: 74 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65  t line is harmle
24f0: 73 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ss in that case.
2500: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d  .    */.    pBt-
2510: 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  >isPending = 0;.
2520: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
2530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2540: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
2550: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
2560: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2570: 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  age);  /* Forwar
2580: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a  d reference */..
2590: 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  /*.** Verify tha
25a0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
25b0: 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  ds a mutex on th
25c0: 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  e BtShared.*/.#i
25d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
25e0: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f  tic int cursorHo
25f0: 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f  ldsMutex(BtCurso
2600: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
2610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2620: 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
2630: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
2640: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2650: 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a  T_INCRBLOB./*.**
2660: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
2670: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
2680: 73 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72  st cache for cur
2690: 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79  sor pCur, if any
26a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26b0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
26c0: 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f  lowCache(BtCurso
26d0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
26e0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26f0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2700: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2710: 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
2720: 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2730: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
2740: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
2750: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
2760: 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63   cache for all c
2770: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  ursors opened.**
2780: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
2790: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
27a0: 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Bt..*/.static vo
27b0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  id invalidateAll
27c0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
27d0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
27e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
27f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2800: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2810: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70  utex) );.  for(p
2820: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
2830: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
2840: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
2850: 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20  rflowCache(p);. 
2860: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65   }.}.#else.  #de
2870: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
2880: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
2890: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
28a0: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
28b0: 61 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a  ache(x).#endif..
28c0: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
28d0: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
28e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
28f0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
2900: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
2910: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
2920: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
2930: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
2940: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
2950: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
2960: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
2970: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
2980: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
2990: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
29a0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
29b0: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
29c0: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
29d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
29e0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
29f0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
2a00: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
2a10: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
2a20: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
2a30: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
2a40: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
2a50: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
2a60: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
2a70: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2a80: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
2a90: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
2aa0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
2ab0: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
2ac0: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
2ad0: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
2ae0: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
2af0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
2b00: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
2b10: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
2b20: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
2b30: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
2b40: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
2b50: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
2b60: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
2b70: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
2b80: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
2b90: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
2ba0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
2bb0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2bc0: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
2bd0: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
2be0: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
2bf0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
2c00: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
2c10: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
2c20: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
2c30: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
2c40: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
2c50: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
2c60: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
2c70: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
2c80: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
2c90: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
2ca0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
2cb0: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
2cc0: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
2cd0: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
2ce0: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
2cf0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
2d00: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
2d10: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
2d20: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
2d30: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
2d40: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
2d50: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
2d60: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
2d70: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
2d80: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
2d90: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
2da0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
2db0: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
2dc0: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
2dd0: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
2de0: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
2df0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
2e00: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
2e10: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
2e20: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
2e30: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
2e40: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
2e50: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
2e60: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
2e70: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
2e80: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
2e90: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
2ea0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
2eb0: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
2ec0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
2ed0: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
2ee0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
2ef0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
2f00: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
2f10: 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74   above is ommitt
2f20: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
2f30: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
2f40: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
2f50: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
2f60: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
2f70: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
2f80: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
2f90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2fa0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
2fb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fc0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
2fd0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
2fe0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2ff0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3000: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
3010: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
3020: 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20     int nPage;.  
3030: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
3040: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
3050: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
3060: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
3070: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3080: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
3090: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
30a0: 65 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50  ecCreate((u32)nP
30b0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
30c0: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
30d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
30e0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
30f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3100: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
3110: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
3120: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
3130: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
3140: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
3150: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
3160: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
3170: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
3180: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3190: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
31a0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
31b0: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
31c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
31d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
31e0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
31f0: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
3200: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
3210: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
3220: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
3230: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
3240: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
3250: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
3260: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
3270: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
3280: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
3290: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
32a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
32b0: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
32c0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
32d0: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
32e0: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
32f0: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
3300: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
3310: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
3320: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
3330: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
3340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
3350: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
3360: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3370: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
3380: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
3390: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
33a0: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
33b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
33c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
33d0: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
33e0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
33f0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
3400: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
3410: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
3420: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
3430: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
3440: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
3450: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
3460: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
3470: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
3480: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
3490: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
34a0: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
34b0: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
34c0: 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61  UIRESEEK..*/.sta
34d0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
34e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
34f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
3500: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3510: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
3520: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
3530: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
3540: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
3550: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
3560: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
3570: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
3580: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
3590: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20  &pCur->nKey);.. 
35a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
35b0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
35c0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
35d0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
35e0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
35f0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
3600: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
3610: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
3620: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
3630: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
3640: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
3650: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
3660: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
3670: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
3680: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
3690: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
36a0: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
36b0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
36c0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
36d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36e0: 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61  && 0==pCur->apPa
36f0: 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a  ge[0]->intKey){.
3700: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
3710: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
3720: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20  (int)pCur->nKey 
3730: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
3740: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
3750: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
3760: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
3770: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
3780: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
3790: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37a0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
37b0: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
37c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37d0: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
37e0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
37f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
3800: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
3810: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
3820: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
3830: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
3840: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
3850: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3860: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3870: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
3880: 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
3890: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
38a0: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
38b0: 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
38c0: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
38d0: 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
38e0: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43  age = -1;.    pC
38f0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
3900: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
3910: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
3920: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3930: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
3940: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
3950: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
3960: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
3970: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
3980: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
3990: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
39a0: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
39b0: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
39c0: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
39d0: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
39e0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
39f0: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
3a00: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
3a10: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
3a20: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
3a30: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
3a40: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
3a50: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
3a60: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
3a70: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3a80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3a90: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3aa0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3ab0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
3ac0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
3ad0: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
3ae0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
3af0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3b00: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
3b10: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
3b20: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26  noRoot==iRoot) &
3b30: 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  & .        p->eS
3b40: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
3b50: 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID ){.      int 
3b60: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
3b70: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
3b80: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
3b90: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =rc ){.        r
3ba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
3bb0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
3be0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
3bf0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
3c00: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
3c10: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
3c20: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
3c30: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
3c40: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
3c50: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3c60: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
3c70: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
3c80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
3c90: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
3ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
3cb0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
3cc0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
3cd0: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
3ce0: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
3cf0: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
3d00: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
3d10: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
3d20: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
3d30: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
3d40: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
3d50: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
3d60: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
3d70: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
3d80: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
3d90: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
3da0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3db0: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
3dc0: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
3dd0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
3de0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
3df0: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
3e00: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
3e10: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
3e20: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
3e30: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
3e40: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
3e50: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
3e60: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
3e70: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
3e80: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
3e90: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
3ea0: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
3eb0: 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61    }.  pCur->eSta
3ec0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
3ed0: 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  LID;.  rc = sqli
3ee0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
3ef0: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
3f00: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
3f10: 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20  &pCur->skip);.  
3f20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3f30: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
3f40: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
3f50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
3f60: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
3f70: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
3f80: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
3f90: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
3fa0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
3fb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3fc0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
3fd0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3fe0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
3ff0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
4000: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
4010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
4020: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
4030: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
4040: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
4050: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
4060: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
4070: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
4080: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
4090: 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61  osition it.** wa
40a0: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74  s last placed at
40b0: 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  .  Cursors can m
40c0: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
40d0: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
40e0: 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65  ng.** at is dele
40f0: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
4100: 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er them..**.** T
4110: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
4120: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rns an error cod
4130: 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  e if something g
4140: 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a  oes wrong.  The.
4150: 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73  ** integer *pHas
4160: 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
4170: 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  one if the curso
4180: 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20  r has moved and 
4190: 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74  0 if not..*/.int
41a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
41b0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
41c0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
41d0: 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69  *pHasMoved){.  i
41e0: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  nt rc;..  rc = r
41f0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
4200: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
4210: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61  ( rc ){.    *pHa
4220: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  sMoved = 1;.    
4230: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
4240: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
4250: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
4260: 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30  || pCur->skip!=0
4270: 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76   ){.    *pHasMov
4280: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
4290: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
42a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
42b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
42c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
42d0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
42e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67  *.** Given a pag
42f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65  e number of a re
4300: 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70  gular database p
4310: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
4320: 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
4330: 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  or the pointer-m
4340: 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  ap page that con
4350: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
4360: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74  for the.** input
4370: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f   page number..*/
4380: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
4390: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
43a0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
43b0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
43c0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
43d0: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
43e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
43f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4400: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4410: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
4420: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
4430: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
4440: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
4450: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
4460: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
4470: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
4480: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
4490: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
44a0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
44b0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
44c0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
44d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
44e0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
44f0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
4500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
4510: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
4520: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
4530: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
4540: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
4550: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
4560: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
4570: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
4580: 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  '..** An error c
4590: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
45a0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
45b0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
45c0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
45d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
45e0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
45f0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
4600: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
4610: 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20  rent){.  DbPage 
4620: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
4630: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
4640: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
4650: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
4660: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
4670: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
4680: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
4690: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
46a0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
46b0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
46c0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
46d0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
46e0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
46f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
4700: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
4710: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
4720: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
4730: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
4740: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
4750: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
4760: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
4770: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
4780: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
4790: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
47a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
47b0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
47c0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
47d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
47e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
47f0: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
4800: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
4810: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
4820: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
4830: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
4840: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
4850: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4860: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
4870: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
4880: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
4890: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
48a0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
48b0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75  et<0 ){.    retu
48c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
48d0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  T_BKPT;.  }.  pP
48e0: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
48f0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
4900: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
4910: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
4920: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
4930: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
4940: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
4950: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
4960: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
4970: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
4980: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
4990: 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nt));.    rc = s
49a0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
49b0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
49c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
49d0: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
49e0: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
49f0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
4a00: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
4a10: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
4a20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
4a30: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
4a40: 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  bPage);.  return
4a50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
4a60: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
4a70: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
4a80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4a90: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
4aa0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
4ab0: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
4ac0: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
4ad0: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
4ae0: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
4af0: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
4b00: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
4b10: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
4b20: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
4b30: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
4b40: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
4b50: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
4b60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
4b70: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
4b80: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
4b90: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
4ba0: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
4bb0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
4bc0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
4bd0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
4be0: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
4bf0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
4c00: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
4c10: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
4c20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
4c30: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
4c40: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
4c50: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
4c60: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
4c70: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
4c80: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
4c90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4ca0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
4cb0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
4cc0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
4cd0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
4ce0: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
4cf0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
4d00: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
4d10: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
4d20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
4d30: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
4d40: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
4d50: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
4d60: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
4d70: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
4d80: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65  ap, key);.  asse
4d90: 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b  rt( pEType!=0 );
4da0: 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74  .  *pEType = pPt
4db0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  rmap[offset];.  
4dc0: 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67  if( pPgno ) *pPg
4dd0: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
4de0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
4df0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
4e00: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
4e10: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
4e20: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
4e30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
4e40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72  ORRUPT_BKPT;.  r
4e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4e60: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
4e70: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
4e80: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
4e90: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
4ea0: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apPut(w,x,y,z) S
4eb0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
4ec0: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
4ed0: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
4ee0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
4ef0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
4f00: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
4f10: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
4f20: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
4f30: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
4f40: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
4f50: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
4f60: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
4f70: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
4f80: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
4f90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
4fa0: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
4fb0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
4fc0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
4fd0: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
4fe0: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
4ff0: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
5000: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
5010: 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d  & get2byte(&(P)-
5020: 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c  >aData[(P)->cell
5030: 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29  Offset+2*(I)])))
5040: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
5050: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
5060: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
5070: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
5080: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
5090: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
50a0: 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69  ow cells.  See i
50b0: 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20  nsert.*/.static 
50c0: 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77  u8 *findOverflow
50d0: 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
50e0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
50f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
5100: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5110: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
5120: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
5130: 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65  or(i=pPage->nOve
5140: 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69  rflow-1; i>=0; i
5150: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  --){.    int k;.
5160: 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c      struct _Ovfl
5170: 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Cell *pOvfl;.   
5180: 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d   pOvfl = &pPage-
5190: 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b  >aOvfl[i];.    k
51a0: 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20   = pOvfl->idx;. 
51b0: 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20     if( k<=iCell 
51c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  ){.      if( k==
51d0: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  iCell ){.       
51e0: 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70   return pOvfl->p
51f0: 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cell;.      }.  
5200: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
5210: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5220: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
5230: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
5240: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
5250: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
5260: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
5270: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
5280: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
5290: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
52a0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71  is function.  sq
52b0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
52c0: 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a  ell() takes a .*
52d0: 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20  * cell index as 
52e0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
52f0: 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42  ent and sqlite3B
5300: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
5310: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
5320: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
5330: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
5340: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
5350: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
5360: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
5370: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
5380: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
5390: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
53a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
53b0: 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69  seCellPtr(). Usi
53c0: 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72  ng some compiler
53d0: 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
53e0: 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  faster..*/.void 
53f0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
5400: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
5410: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
5420: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
5430: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
5440: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5460: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
5470: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
5480: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
5490: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
54a0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
54b0: 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20   */.){.  u16 n; 
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73   /* Number bytes
54e0: 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   in cell content
54f0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
5500: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
5510: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5520: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
5530: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73  payload */..  as
5540: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
5550: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
5560: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
5570: 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d    pInfo->pCell =
5580: 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74   pCell;.  assert
5590: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
55a0: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
55b0: 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67  =1 );.  n = pPag
55c0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
55d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d  .  assert( n==4-
55e0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
55f0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
5600: 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20  tKey ){.    if( 
5610: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
5620: 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74  {.      n += get
5630: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
5640: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
5650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5660: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
5670: 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74    }.    n += get
5680: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d  Varint(&pCell[n]
5690: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
56a0: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f  nKey);.    pInfo
56b0: 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f  ->nData = nPaylo
56c0: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
56d0: 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20   pInfo->nData = 
56e0: 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  0;.    n += getV
56f0: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
5700: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
5710: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
5720: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20  nPayload;.  }.  
5730: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
5740: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
5750: 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e  nfo->nHeader = n
5760: 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e  ;.  if( likely(n
5770: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
5780: 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  maxLocal) ){.   
5790: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
57a0: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
57b0: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
57c0: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
57d0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
57e0: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
57f0: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
5800: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
5810: 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  int nSize;      
5820: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
5830: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
5840: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  t in bytes */.  
5850: 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f    nSize = nPaylo
5860: 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66  ad + n;.    pInf
5870: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
5880: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70  )nPayload;.    p
5890: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
58a0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53  = 0;.    if( (nS
58b0: 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a  ize & ~3)==0 ){.
58c0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b        nSize = 4;
58d0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
58e0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
58f0: 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70  4 */.    }.    p
5900: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75  Info->nSize = (u
5910: 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73  16)nSize;.  }els
5920: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
5930: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
5940: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
5950: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
5960: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20  ge, we have.    
5970: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
5980: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
5990: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
59a0: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
59b0: 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  o.    ** overflo
59c0: 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74  w pages.  The st
59d0: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e  rategy is to min
59e0: 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74  imize the amount
59f0: 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a   of unused.    *
5a00: 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66  * space on overf
5a10: 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20  low pages while 
5a20: 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75  keeping the amou
5a30: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72  nt of local stor
5a40: 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65  age.    ** in be
5a50: 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61  tween minLocal a
5a60: 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20  nd maxLocal..   
5a70: 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69   **.    ** Warni
5a80: 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68  ng:  changing th
5a90: 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70  e way overflow p
5aa0: 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69  ayload is distri
5ab0: 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20  buted in any.   
5ac0: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
5ad0: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
5ae0: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
5af0: 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  at..    */.    i
5b00: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
5b10: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
5b20: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
5b30: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69  locally */.    i
5b40: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a  nt maxLocal;  /*
5b50: 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Maximum amount 
5b60: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
5b70: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69  locally */.    i
5b80: 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a  nt surplus;   /*
5b90: 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   Overflow payloa
5ba0: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
5bb0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f  local storage */
5bc0: 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d  ..    minLocal =
5bd0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
5be0: 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  ;.    maxLocal =
5bf0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
5c00: 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20  ;.    surplus = 
5c10: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79  minLocal + (nPay
5c20: 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  load - minLocal)
5c30: 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  %(pPage->pBt->us
5c40: 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
5c50: 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c     if( surplus <
5c60: 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  = maxLocal ){.  
5c70: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
5c80: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
5c90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5ca0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
5cb0: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
5cc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66  ;.    }.    pInf
5cd0: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  o->iOverflow = (
5ce0: 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  u16)(pInfo->nLoc
5cf0: 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e  al + n);.    pIn
5d00: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66  fo->nSize = pInf
5d10: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34  o->iOverflow + 4
5d20: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
5d30: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
5d40: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c   iCell, pInfo) \
5d50: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
5d60: 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61  arseCellPtr((pPa
5d70: 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70  ge), findCell((p
5d80: 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c  Page), (iCell)),
5d90: 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73   (pInfo)).void s
5da0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
5db0: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
5dc0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
5dd0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
5de0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
5df0: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
5e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5e10: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
5e20: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
5e30: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
5e40: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
5e50: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
5e60: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73  ure */.){.  pars
5e70: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
5e80: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  ll, pInfo);.}../
5e90: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
5ea0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
5eb0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
5ec0: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
5ed0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
5ee0: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
5ef0: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
5f00: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
5f10: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
5f20: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
5f30: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
5f40: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
5f50: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
5f60: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
5f70: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
5f80: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  er..*/.static u1
5f90: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
5fa0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
5fb0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
5fc0: 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70  pIter = &pCell[p
5fd0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
5fe0: 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65  ze];.  u32 nSize
5ff0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
6000: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
6010: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
6020: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
6030: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
6040: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
6050: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
6060: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
6070: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
6080: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
6090: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
60a0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
60b0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
60c0: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
60d0: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
60e0: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
60f0: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
6100: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
6110: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
6120: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
6130: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
6140: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
6150: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
6160: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
6170: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
6180: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b  ){.    u8 *pEnd;
6190: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
61a0: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
61b0: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
61c0: 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69  int32(pIter, nSi
61d0: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
61e0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b        nSize = 0;
61f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70  .    }..    /* p
6200: 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20  Iter now points 
6210: 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  at the 64-bit in
6220: 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c  teger key value,
6230: 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
6240: 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  th .    ** integ
6250: 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
6260: 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49  g block moves pI
6270: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
6280: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
6290: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
62a0: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61  nd of the key va
62b0: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64  lue. */.    pEnd
62c0: 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20   = &pIter[9];.  
62d0: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
62e0: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
62f0: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73  r<pEnd );.  }els
6300: 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20  e{.    pIter += 
6310: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
6320: 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  r, nSize);.  }..
6330: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
6340: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
6350: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20     int minLocal 
6360: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
6370: 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  l;.    nSize = m
6380: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65  inLocal + (nSize
6390: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28   - minLocal) % (
63a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
63b0: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
63c0: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
63d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
63e0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
63f0: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
6400: 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a  nSize += 4;.  }.
6410: 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29    nSize += (u32)
6420: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
6430: 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d  ..  /* The minim
6440: 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63  um size of any c
6450: 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20  ell is 4 bytes. 
6460: 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  */.  if( nSize<4
6470: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   ){.    nSize = 
6480: 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  4;.  }..  assert
6490: 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e  ( nSize==debugin
64a0: 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65  fo.nSize );.  re
64b0: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
64c0: 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  .}.#ifndef NDEBU
64d0: 47 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  G.static u16 cel
64e0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
64f0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
6500: 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c 53  {.  return cellS
6510: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66 69  izePtr(pPage, fi
6520: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
6530: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
6540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6550: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
6560: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
6570: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
6580: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
6590: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
65a0: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
65b0: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
65c0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
65d0: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
65e0: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
65f0: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
6600: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66  int ptrmapPutOvf
6610: 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  lPtr(MemPage *pP
6620: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
6630: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
6640: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
6650: 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l!=0 );.  sqlite
6660: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
6670: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
6680: 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
6690: 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  t( (info.nData+(
66a0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
66b0: 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66  info.nKey))==inf
66c0: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
66d0: 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
66e0: 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  ow ){.    Pgno o
66f0: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
6700: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
6710: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75  flow]);.    retu
6720: 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61  rn ptrmapPut(pPa
6730: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
6740: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
6750: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
6760: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
6770: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
6780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
6790: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
67a0: 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72  n.  All Cells ar
67b0: 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
67c0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  * end of the pag
67d0: 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73  e and all free s
67e0: 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65  pace is collecte
67f0: 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69  d into one.** bi
6800: 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f  g FreeBlk that o
6810: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
6820: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
6830: 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  cell.** pointer 
6840: 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65  array and the ce
6850: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
6860: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6870: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
6880: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
6890: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
68b0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
68c0: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
68e0: 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68  ddress of a i-th
68f0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61   cell */.  int a
6900: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
6910: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6920: 6f 66 20 66 69 72 73 74 20 62 79 74 65 20 61 66  of first byte af
6930: 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ter cell pointer
6940: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
6950: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
6960: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
6970: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
6980: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
6990: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
69a0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
69b0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
69c0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
69d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
69e0: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
69f0: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
6a00: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
6a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
6a20: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
6a30: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
6a40: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a60: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
6a70: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
6a80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
6ab0: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
6ac0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
6ad0: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
6ae0: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
6af0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
6b00: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
6b10: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
6b20: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
6b30: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
6b40: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
6b50: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
6b60: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
6b70: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
6b80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6b90: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
6ba0: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
6bb0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
6bc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6bd0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
6be0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6bf0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6c00: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6c10: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
6c20: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
6c30: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
6c40: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
6c50: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
6c60: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
6c70: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
6c80: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
6c90: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
6ca0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
6cb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
6cc0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
6cd0: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
6ce0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
6cf0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6d00: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
6d10: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
6d20: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
6d30: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
6d40: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
6d50: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
6d60: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
6d70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
6d80: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
6d90: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
6da0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
6db0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
6dc0: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
6dd0: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
6de0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
6df0: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 69 66 28  (pAddr);.    if(
6e00: 20 70 63 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20   pc>=usableSize 
6e10: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6e20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6e30: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  KPT;.    }.    s
6e40: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
6e50: 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70  r(pPage, &temp[p
6e60: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
6e70: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
6e80: 62 72 6b 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32  brk<cellOffset+2
6e90: 2a 6e 43 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a  *nCell || pc+siz
6ea0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
6eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6ec0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
6ee0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
6ef0: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
6f00: 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63  k>=0 );.    memc
6f10: 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  py(&data[cbrk], 
6f20: 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29  &temp[pc], size)
6f30: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
6f40: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d  Addr, cbrk);.  }
6f50: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
6f60: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
6f70: 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ell );.  put2byt
6f80: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
6f90: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
6fa0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
6fb0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
6fc0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
6fd0: 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66    addr = cellOff
6fe0: 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d  set+2*nCell;.  m
6ff0: 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72  emset(&data[addr
7000: 5d 2c 20 30 2c 20 63 62 72 6b 2d 61 64 64 72 29  ], 0, cbrk-addr)
7010: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7020: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
7030: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
7040: 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72  ge) );.  if( cbr
7050: 6b 2d 61 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e  k-addr!=pPage->n
7060: 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Free ){.    retu
7070: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7080: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
7090: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
70a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
70b0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
70c0: 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68   space from with
70d0: 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61  in the B-Tree pa
70e0: 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  ge passed.** as 
70f0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
7100: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 69  nt. Return the i
7110: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
7120: 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20  >aData[] of the 
7130: 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65 20 6f  .** first byte o
7140: 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  f allocated spac
7150: 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  e. .**.** The ca
7160: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
7170: 74 68 61 74 20 74 68 65 20 73 70 61 63 65 20 62  that the space b
7180: 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
7190: 66 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73 65  f the cell-offse
71a0: 74 20 0a 2a 2a 20 61 72 72 61 79 20 61 6e 64 20  t .** array and 
71b0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
71c0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
71d0: 65 61 20 69 73 20 61 74 20 6c 65 61 73 74 20 6e  ea is at least n
71e0: 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 69 6e  Byte bytes.** in
71f0: 20 73 69 7a 65 2e 20 53 6f 20 74 68 69 73 20 72   size. So this r
7200: 6f 75 74 69 6e 65 20 63 61 6e 20 6e 65 76 65 72  outine can never
7210: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   fail..**.** If 
7220: 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
7230: 79 20 36 30 20 6f 72 20 6d 6f 72 65 20 62 79 74  y 60 or more byt
7240: 65 73 20 6f 66 20 66 72 61 67 6d 65 6e 74 73 20  es of fragments 
7250: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c  within the page,
7260: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20  .** the page is 
7270: 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66  defragmented bef
7280: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49  ore returning. I
7290: 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20  f this were not 
72a0: 64 6f 6e 65 20 74 68 65 72 65 0a 2a 2a 20 69 73  done there.** is
72b0: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
72c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
72d0: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 63 6f  gmented bytes co
72e0: 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  uld eventually .
72f0: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 74 68 65 20  ** overflow the 
7300: 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 65 6c  single-byte fiel
7310: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2d 68 65  d of the page-he
7320: 61 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  ader in which th
7330: 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  is value.** is s
7340: 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tored..*/.static
7350: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
7360: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
7370: 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  e, int nByte){. 
7380: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
7390: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
73a0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
73b0: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
73c0: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
73d0: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
73e0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
73f0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
7400: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
7410: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67  a */.  int nFrag
7420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7440: 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e  umber of fragmen
7450: 74 65 64 20 62 79 74 65 73 20 6f 6e 20 70 50 61  ted bytes on pPa
7460: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  ge */.  int top;
7470: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
7480: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
7490: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
74a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
74b0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
74c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
74d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
74e0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
74f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
7500: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
7510: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
7520: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
7530: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
7540: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
7550: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
7560: 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  low==0 );..  /* 
7570: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
7580: 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 74 68  space between th
7590: 65 20 63 65 6c 6c 2d 6f 66 66 73 65 74 20 61 72  e cell-offset ar
75a0: 72 61 79 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ray and the .  *
75b0: 2a 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  * cell-content a
75c0: 72 65 61 20 69 73 20 67 72 65 61 74 65 72 20 74  rea is greater t
75d0: 68 61 6e 20 6e 42 79 74 65 20 62 79 74 65 73 2e  han nByte bytes.
75e0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
75f0: 6e 42 79 74 65 20 3c 3d 20 28 0a 20 20 20 20 20  nByte <= (.     
7600: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7610: 68 64 72 2b 35 5d 29 2d 28 68 64 72 2b 38 2b 28  hdr+5])-(hdr+8+(
7620: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
7630: 2b 32 2a 67 65 74 32 62 79 74 65 28 26 64 61 74  +2*get2byte(&dat
7640: 61 5b 68 64 72 2b 33 5d 29 29 0a 20 20 29 29 3b  a[hdr+3])).  ));
7650: 0a 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ..  pPage->nFree
7660: 20 2d 3d 20 28 75 31 36 29 6e 42 79 74 65 3b 0a   -= (u16)nByte;.
7670: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
7680: 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72  dr+7];.  if( nFr
7690: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 64 65  ag>=60 ){.    de
76a0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
76b0: 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
76c0: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
76d0: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
76e0: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
76f0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
7700: 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74  atisfy .    ** t
7710: 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20  he request. The 
7720: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61  allocation is ma
7730: 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  de from the firs
7740: 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a  t free slot in .
7750: 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20      ** the list 
7760: 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e  that is large en
7770: 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61  ough to accomada
7780: 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  te it..    */.  
7790: 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a    int pc, addr;.
77a0: 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72      for(addr=hdr
77b0: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
77c0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
77d0: 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20  >0; addr=pc){.  
77e0: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67      int size = g
77f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
7800: 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20 53 69 7a  +2]);     /* Siz
7810: 65 20 6f 66 20 66 72 65 65 20 73 6c 6f 74 20 2a  e of free slot *
7820: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  /.      if( size
7830: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
7840: 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20     int x = size 
7850: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
7860: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
7870: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
7880: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
7890: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
78a0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
78b0: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
78c0: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
78d0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
78e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
78f0: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
7900: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
7910: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
7920: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
7930: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
7940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7950: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
7960: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
7970: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
7980: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
7990: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unt.          **
79a0: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
79b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
79c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
79d0: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
79e0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
79f0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
7a00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20        return pc 
7a10: 2b 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  + x;.      }.   
7a20: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
7a30: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
7a40: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
7a50: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
7a60: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
7a70: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
7a80: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f  ntent area..  */
7a90: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
7aa0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
7ab0: 2d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  - nByte;.  put2b
7ac0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
7ad0: 2c 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e  , top);.  return
7ae0: 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   top;.}../*.** R
7af0: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
7b00: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
7b10: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
7b20: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
7b30: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
7b40: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
7b50: 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61  pPage->aDisk[sta
7b60: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
7b70: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
7b80: 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73   is "size" bytes
7b90: 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20  ..**.** Most of 
7ba0: 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20  the effort here 
7bb0: 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63  is involved in c
7bc0: 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e  oalesing adjacen
7bd0: 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73  t.** free blocks
7be0: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62   into a single b
7bf0: 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a  ig free block..*
7c00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
7c10: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
7c20: 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74  pPage, int start
7c30: 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69  , int size){.  i
7c40: 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c  nt addr, pbegin,
7c50: 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64   hdr;.  unsigned
7c60: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
7c70: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61  age->aData;..  a
7c80: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
7c90: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
7ca0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
7cb0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
7cc0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
7cd0: 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50  ssert( start>=pP
7ce0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
7cf0: 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a  +(pPage->leaf?0:
7d00: 34 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  4) );.  assert( 
7d10: 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d  (start + size)<=
7d20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
7d30: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
7d40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7d50: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
7d60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
7d70: 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29  ssert( size>=0 )
7d80: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
7d90: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
7da0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7db0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
7dc0: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
7dd0: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
7de0: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
7df0: 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45   the SECURE_DELE
7e00: 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  TE .  ** option 
7e10: 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  is enabled at co
7e20: 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20  mpile-time */.  
7e30: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61  memset(&data[sta
7e40: 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23  rt], 0, size);.#
7e50: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
7e60: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
7e70: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
7e80: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
7e90: 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61  s */.  hdr = pPa
7ea0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
7eb0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
7ec0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
7ed0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
7ee0: 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74  ta[addr]))<start
7ef0: 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a   && pbegin>0 ){.
7f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
7f10: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
7f20: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
7f30: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 3d      if( pbegin<=
7f40: 61 64 64 72 20 29 20 7b 0a 20 20 20 20 20 20 72  addr ) {.      r
7f50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7f60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
7f70: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67  .    addr = pbeg
7f80: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 20 28 20 70  in;.  }.  if ( p
7f90: 62 65 67 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74  begin>pPage->pBt
7fa0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
7fb0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
7fc0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7fd0: 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
7fe0: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20   pbegin>addr || 
7ff0: 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70  pbegin==0 );.  p
8000: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  ut2byte(&data[ad
8010: 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70  dr], start);.  p
8020: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
8030: 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20  art], pbegin);. 
8040: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
8050: 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b  start+2], size);
8060: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
8070: 2b 3d 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20  += (u16)size;.. 
8080: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
8090: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
80a0: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50  s */.  addr = pP
80b0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b  age->hdrOffset +
80c0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
80d0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
80e0: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
80f0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
8100: 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20  , psize, x;.    
8110: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
8120: 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ddr );.    asser
8130: 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65  t( pbegin<=pPage
8140: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8150: 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74  e-4 );.    pnext
8160: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8170: 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20  a[pbegin]);.    
8180: 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  psize = get2byte
8190: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
81a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  );.    if( pbegi
81b0: 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d  n + psize + 3 >=
81c0: 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e   pnext && pnext>
81d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  0 ){.      int f
81e0: 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70  rag = pnext - (p
81f0: 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20  begin+psize);.  
8200: 20 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29      if( (frag<0)
8210: 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64   || (frag>(int)d
8220: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
8230: 66 73 65 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20  fset+7]) ){.    
8240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8250: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
8270: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
8280: 73 65 74 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72  set+7] -= (u8)fr
8290: 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  ag;.      x = ge
82a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
82b0: 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32  xt]);.      put2
82c0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
82d0: 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20  n], x);.      x 
82e0: 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79  = pnext + get2by
82f0: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32  te(&data[pnext+2
8300: 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20  ]) - pbegin;.   
8310: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
8320: 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b  a[pbegin+2], x);
8330: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8340: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
8350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8360: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
8370: 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73  tent area begins
8380: 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63   with a freebloc
8390: 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  k, remove it. */
83a0: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
83b0: 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20  1]==data[hdr+5] 
83c0: 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d  && data[hdr+2]==
83d0: 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20  data[hdr+6] ){. 
83e0: 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20     int top;.    
83f0: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
8400: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
8410: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
8420: 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b  a[hdr+1], &data[
8430: 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20  pbegin], 2);.   
8440: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
8450: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20  &data[hdr+5]) + 
8460: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
8470: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70  begin+2]);.    p
8480: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
8490: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a  r+5], top);.  }.
84a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
84b0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
84c0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
84d0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
84e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
84f0: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
8500: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
8510: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
8520: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
8530: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
8540: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
8550: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
8560: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
8570: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
8580: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
8590: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
85a0: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
85b0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
85c0: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
85d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
85e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
85f0: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
8600: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
8610: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
8620: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
8630: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
8640: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
8650: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
8660: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
8670: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
8680: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
8690: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
86a0: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
86b0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
86c0: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
86d0: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
86e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
86f0: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
8700: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
8710: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
8720: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8730: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
8740: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
8750: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
8760: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
8770: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
8780: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
8790: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
87a0: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
87b0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
87c0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
87d0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
87e0: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
87f0: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
8800: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
8810: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
8820: 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  y = 1;.    pPage
8830: 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61 67  ->hasData = pPag
8840: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61  e->leaf;.    pPa
8850: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
8860: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
8870: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
8880: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
8890: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
88a0: 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
88b0: 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ATA ){.    pPage
88c0: 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
88d0: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
88e0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
88f0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
8900: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70  >maxLocal;.    p
8910: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
8920: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a   pBt->minLocal;.
8930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
8940: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8950: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
8960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
8980: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
8990: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
89a0: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
89b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
89c0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
89d0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
89e0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
89f0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
8a00: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
8a10: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
8a20: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
8a30: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
8a40: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
8a50: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
8a60: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
8a70: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
8a80: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
8a90: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
8aa0: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
8ab0: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
8ac0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
8ad0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
8ae0: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
8af0: 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73  e *pPage){..  as
8b00: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8b10: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8b20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8b30: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8b40: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
8b50: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
8b60: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
8b70: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
8b80: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8b90: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
8ba0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8bb0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
8bc0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
8bd0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
8be0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
8bf0: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
8c00: 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ge) );..  if( !p
8c10: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
8c20: 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20      u16 pc;     
8c30: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8c40: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
8c50: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
8c60: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38  Data[] */.    u8
8c70: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
8c80: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
8c90: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
8ca0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38  header */.    u8
8cb0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
8cc0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
8cd0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20  ge->aData */.   
8ce0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
8cf0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
8d00: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
8d10: 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75 73  re */.    u16 us
8d20: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  ableSize;    /* 
8d30: 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65  Amount of usable
8d40: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
8d50: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63  age */.    u16 c
8d60: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
8d70: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
8d80: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
8d90: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
8da0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72 65   */.    u16 nFre
8db0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
8dc0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
8dd0: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
8de0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70 3b   */.    u16 top;
8df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8e00: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
8e10: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
8e20: 61 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  a */..    pBt = 
8e30: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
8e40: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
8e50: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
8e60: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
8e70: 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  ;.    if( decode
8e80: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
8e90: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
8ea0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8eb0: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
8ec0: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
8ed0: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
8ee0: 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a  eSize<=32768 );.
8ef0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
8f00: 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  age = pBt->pageS
8f10: 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61  ize - 1;.    pPa
8f20: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
8f30: 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  0;.    usableSiz
8f40: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
8f50: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ize;.    pPage->
8f60: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
8f70: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
8f80: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
8f90: 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  af;.    top = ge
8fa0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8fb0: 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  +5]);.    pPage-
8fc0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
8fd0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
8fe0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
8ff0: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
9000: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
9010: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
9020: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
9030: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
9040: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
9050: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9060: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9070: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 6d     }..    /* A m
9080: 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
9090: 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
90a0: 73 65 20 75 73 65 20 74 6f 20 72 65 61 64 20 70  se use to read p
90b0: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
90c0: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
90d0: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
90e0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
90f0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
9100: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
9110: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
9120: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
9130: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
9140: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
9150: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
9160: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
9170: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
9180: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
9190: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  does..    */.#if
91a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
91b0: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
91c0: 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20  CELL_CHECK).    
91d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 65 6c  {.      int iCel
91e0: 6c 46 69 72 73 74 3b 20 20 20 2f 2a 20 46 69 72  lFirst;   /* Fir
91f0: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
9200: 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
9210: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
9220: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
9230: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
9240: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
9250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9260: 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c  ex into the cell
9270: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
9280: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20  /.      int sz; 
9290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
92a0: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a  e of a cell */..
92b0: 20 20 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74        iCellFirst
92c0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
92d0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
92e0: 20 20 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20        iCellLast 
92f0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
9300: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
9310: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
9320: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
9330: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
9340: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
9350: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
9360: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
9370: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
9380: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
9390: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
93a0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
93b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
93c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
93d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
93e0: 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
93f0: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
9400: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
9410: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
9420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
9430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9440: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
9450: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9460: 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  }  .#endif..    
9470: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
9480: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
9490: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
94a0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
94b0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
94c0: 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
94d0: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20  [hdr+7] + top;. 
94e0: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
94f0: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
9500: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
9510: 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d  ( pc>usableSize-
9520: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
9530: 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66  Free block is of
9540: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
9550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9560: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9570: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
9580: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
9590: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
95a0: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
95b0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
95c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e  .      if( next>
95d0: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
95e0: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20 20  ze+3 ){.        
95f0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d  /* Free blocks m
9600: 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64  ust be in accend
9610: 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
9620: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9630: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9640: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
9650: 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20  nFree = nFree + 
9660: 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d  size;.      pc =
9670: 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20   next;.    }..  
9680: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
9690: 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
96a0: 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
96b0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
96c0: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20  start.    ** of 
96d0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
96e0: 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e   area plus the n
96f0: 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79  umber of free by
9700: 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a  tes within.    *
9710: 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  * the cell-conte
9720: 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73  nt area. If this
9730: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
9740: 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65   the usable-size
9750: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
9760: 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
9770: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
9780: 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
9790: 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72   also.    ** ser
97a0: 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
97b0: 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
97c0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
97d0: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
97e0: 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f     ** area, acco
97f0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  rding to the pag
9800: 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77  e header, lies w
9810: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a  ithin the page..
9820: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
9830: 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
9840: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9850: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9860: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
9870: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e  pPage->nFree = n
9880: 46 72 65 65 20 2d 20 28 63 65 6c 6c 4f 66 66 73  Free - (cellOffs
9890: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
98a0: 65 6c 6c 29 3b 0a 0a 23 69 66 20 30 0a 20 20 2f  ell);..#if 0.  /
98b0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c 6c  * Check that all
98c0: 20 74 68 65 20 6f 66 66 73 65 74 73 20 69 6e 20   the offsets in 
98d0: 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65 74 20  the cell offset 
98e0: 61 72 72 61 79 20 61 72 65 20 77 69 74 68 69 6e  array are within
98f0: 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a 20   range. .  ** . 
9900: 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20 74 68 69   ** Omitting thi
9910: 73 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 63 68  s consistency ch
9920: 65 63 6b 20 61 6e 64 20 75 73 69 6e 67 20 74 68  eck and using th
9930: 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  e pPage->maskPag
9940: 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74 6f 20 70  e mask.  ** to p
9950: 72 65 76 65 6e 74 20 6f 76 65 72 72 75 6e 6e 69  revent overrunni
9960: 6e 67 20 74 68 65 20 70 61 67 65 20 62 75 66 66  ng the page buff
9970: 65 72 20 69 6e 20 66 69 6e 64 43 65 6c 6c 28 29  er in findCell()
9980: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 0a 20 20   results in a.  
9990: 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f 72 6d 61  ** 2.5% performa
99a0: 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20  nce gain..  */. 
99b0: 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f 66 66 3b   {.    u8 *pOff;
99c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
99d0: 74 6f 72 20 75 73 65 64 20 74 6f 20 63 68 65 63  tor used to chec
99e0: 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65  k all cell offse
99f0: 74 73 20 61 72 65 20 69 6e 20 72 61 6e 67 65 20  ts are in range 
9a00: 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b  */.    u8 *pEnd;
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9a20: 65 72 20 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c  er to end of cel
9a30: 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 2a  l offset array *
9a40: 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b 3b 20 20  /.    u8 mask;  
9a50: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
9a60: 66 20 62 69 74 73 20 74 68 61 74 20 6d 75 73 74  f bits that must
9a70: 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20   be zero in MSB 
9a80: 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20  of cell offsets 
9a90: 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20 7e 28  */.    mask = ~(
9aa0: 28 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53  ((u8)(pBt->pageS
9ab0: 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 20  ize>>8))-1);.   
9ac0: 20 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65   pEnd = &data[ce
9ad0: 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50 61 67 65  llOffset + pPage
9ae0: 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20  ->nCell*2];.    
9af0: 66 6f 72 28 70 4f 66 66 3d 26 64 61 74 61 5b 63  for(pOff=&data[c
9b00: 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66  ellOffset]; pOff
9b10: 21 3d 70 45 6e 64 20 26 26 20 21 28 28 2a 70 4f  !=pEnd && !((*pO
9b20: 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b  ff)&mask); pOff+
9b30: 3d 32 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 66  =2);.    if( pOf
9b40: 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  f!=pEnd ){.     
9b50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9b60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9b70: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
9b80: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
9b90: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
9ba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9bb0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
9bc0: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
9bd0: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
9be0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
9bf0: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
9c00: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
9c10: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
9c20: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9c30: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
9c40: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
9c50: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
9c60: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
9c70: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
9c80: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
9c90: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
9ca0: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
9cb0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
9cc0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
9cd0: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
9ce0: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
9cf0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9d00: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
9d10: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
9d20: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
9d30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9d40: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
9d50: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
9d60: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
9d70: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
9d80: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
9d90: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
9da0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9db0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
9dc0: 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74  x) );.  /*memset
9dd0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
9de0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
9df0: 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61  - hdr);*/.  data
9e00: 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
9e10: 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
9e20: 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61  dr + 8 + 4*((fla
9e30: 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20  gs&PTF_LEAF)==0 
9e40: 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ?1:0);.  memset(
9e50: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
9e60: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
9e70: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
9e80: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
9e90: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
9ea0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
9eb0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
9ec0: 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64  ize - first;.  d
9ed0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
9ee0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
9ef0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68  e->hdrOffset = h
9f00: 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  dr;.  pPage->cel
9f10: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
9f20: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
9f30: 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
9f40: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
9f50: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
9f60: 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b  geSize<=32768 );
9f70: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
9f80: 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ge = pBt->pageSi
9f90: 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d  ze - 1;.  pPage-
9fa0: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
9fb0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
9fc0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
9fd0: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
9fe0: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
9ff0: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
a000: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
a010: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
a020: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
a030: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
a040: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
a050: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
a060: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
a070: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
a080: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
a090: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
a0a0: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
a0b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
a0c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
a0d0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
a0e0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
a0f0: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
a100: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
a110: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
a120: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
a130: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
a140: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
a150: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
a160: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
a170: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
a180: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
a190: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
a1a0: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
a1b0: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
a1c0: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a   if needed..**.*
a1d0: 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65  * If the noConte
a1e0: 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nt flag is set, 
a1f0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
a200: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
a210: 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
a220: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
a230: 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
a240: 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
a250: 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
a260: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
a270: 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
a280: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
a290: 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
a2a0: 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
a2b0: 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
a2c0: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
a2d0: 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
a2e0: 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
a2f0: 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
a300: 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
a310: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
a320: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
a330: 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
a340: 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   point..*/.int s
a350: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
a360: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
a370: 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
a380: 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
a390: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
a3a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
a3b0: 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
a3c0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
a3d0: 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
a3e0: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
a3f0: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
a400: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
a410: 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  nt        /* Do 
a420: 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f  not load page co
a430: 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f  ntent if true */
a440: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a450: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
a460: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
a470: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a480: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a490: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
a4a0: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
a4b0: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
a4c0: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
a4d0: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
a4e0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a4f0: 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
a500: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
a510: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
a520: 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
a530: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a540: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
a550: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
a560: 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
a570: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
a580: 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
a590: 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
a5a0: 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
a5b0: 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
a5c0: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
a5d0: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
a5e0: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
a5f0: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
a600: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
a610: 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
a620: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
a630: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
a640: 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
a650: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a660: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
a670: 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
a680: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
a690: 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
a6a0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
a6b0: 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
a6c0: 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
a6d0: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
a6e0: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
a6f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
a700: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
a710: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
a720: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
a730: 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
a740: 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
a750: 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
a760: 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
a770: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
a780: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42 74  agerPagecount(Bt
a790: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
a7a0: 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b 0a  int nPage = -1;.
a7b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
a7c0: 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
a7d0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
a7e0: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
a7f0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
a800: 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
a810: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
a820: 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20 20   nPage==-1 );.  
a830: 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50 61  return (Pgno)nPa
a840: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ge;.}../*.** Get
a850: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
a860: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
a870: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
a880: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75  routine.** is ju
a890: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  st a convenience
a8a0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
a8b0: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
a8c0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
a8d0: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 73  eGetPage() and s
a8e0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
a8f0: 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
a900: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
a910: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
a920: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
a930: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
a940: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
a950: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
a960: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
a970: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
a980: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
a990: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
a9a0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
a9b0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
a9c0: 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
a9d0: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
a9e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a9f0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
aa00: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
aa10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
aa20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
aa30: 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PT; .  }..  /* I
aa40: 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63  t is often the c
aa50: 61 73 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ase that the pag
aa60: 65 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72  e we want is alr
aa70: 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20  eady in cache.. 
aa80: 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69   ** If so, get i
aa90: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
aaa0: 73 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20  s saves us from 
aab0: 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20  having to call. 
aac0: 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75   ** pagerPagecou
aad0: 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72  nt() to make sur
aae0: 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e  e pgno is within
aaf0: 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72   limits, which r
ab00: 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61  esults.  ** in a
ab10: 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65 72   measureable per
ab20: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
ab30: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a 70  ments..  */.  *p
ab40: 70 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20  pPage = pPage = 
ab50: 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
ab60: 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  pBt, pgno);.  if
ab70: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2f  ( pPage ){.    /
ab80: 2a 20 50 61 67 65 20 69 73 20 61 6c 72 65 61 64  * Page is alread
ab90: 79 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  y in cache */.  
aba0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
abb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
abc0: 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e 20 63 61  * Page not in ca
abd0: 63 68 65 2e 20 20 41 63 71 75 69 72 65 20 69 74  che.  Acquire it
abe0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
abf0: 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
ac00: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
ac10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ac20: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
ac30: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
ac40: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
ac50: 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
ac60: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
ac70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
ac80: 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61 67    pPage = *ppPag
ac90: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  e;.  }.  if( !pP
aca0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
acb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
acc0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
acd0: 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
ace0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
acf0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
ad00: 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70 50  pPage);.    *ppP
ad10: 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
ad20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ad30: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
ad40: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
ad50: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
ad60: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
ad70: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
ad80: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e  te3BtreeGetPage.
ad90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ada0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
adb0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
adc0: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
add0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
ade0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73  Overflow==0 || s
adf0: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
ae00: 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70  efcount(pPage->p
ae10: 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20 20  DbPage)>1 );.   
ae20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ae30: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
ae40: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
ae50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
ae60: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
ae70: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
ae80: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
ae90: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
aea0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
aeb0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
aec0: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
aed0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
aee0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
aef0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
af00: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
af10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
af20: 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
af30: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
af40: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
af50: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
af60: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
af70: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
af80: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
af90: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
afa0: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
afb0: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
afc0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
afd0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
afe0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
aff0: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
b000: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
b010: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b020: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
b030: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
b040: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
b050: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
b060: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
b070: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
b080: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
b090: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
b0a0: 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
b0b0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
b0c0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
b0d0: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
b0e0: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
b0f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b100: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
b110: 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
b120: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
b130: 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
b140: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b150: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b160: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
b170: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
b180: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
b190: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
b1a0: 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
b1b0: 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
b1c0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
b1d0: 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
b1e0: 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
b1f0: 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
b200: 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
b210: 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
b220: 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
b230: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
b240: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
b250: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
b260: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
b270: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
b280: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
b290: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
b2a0: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
b2b0: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
b2c0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
b2d0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
b2e0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
b2f0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
b300: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
b310: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
b320: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
b330: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
b340: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
b350: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
b360: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
b370: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
b380: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b390: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
b3a0: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
b3b0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
b3c0: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
b3d0: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
b3e0: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
b3f0: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
b400: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
b410: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
b420: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b430: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
b440: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
b450: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b460: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
b470: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
b480: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
b490: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
b4a0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
b4b0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
b4c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
b4d0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
b4e0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
b4f0: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
b500: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
b510: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
b520: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
b530: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
b540: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
b550: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
b560: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
b570: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
b580: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
b590: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
b5a0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
b5b0: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
b5c0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
b5d0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
b5e0: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
b5f0: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
b600: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
b610: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
b620: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
b630: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
b640: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
b650: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
b660: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
b670: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
b680: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
b690: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
b6a0: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
b6b0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
b6c0: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
b6d0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
b6e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b6f0: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
b700: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
b710: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
b720: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
b730: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
b740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
b750: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
b760: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
b770: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
b780: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
b790: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
b7a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
b7b0: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
b7c0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
b7d0: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
b7e0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b7f0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
b800: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
b810: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
b820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b830: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
b840: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
b850: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
b860: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
b870: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
b880: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
b890: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
b8a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b8b0: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
b8c0: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
b8d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
b8e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
b8f0: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
b900: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
b910: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
b940: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
b950: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
b960: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
b970: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
b980: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
b990: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
b9a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b9c0: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
b9d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
b9e0: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
ba10: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
ba20: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
ba30: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
ba40: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
ba50: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
ba60: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53  ntent */..  /* S
ba70: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
ba80: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
ba90: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
baa0: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
bab0: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
bac0: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
bad0: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
bae0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
baf0: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
bb00: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
bb10: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
bb20: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
bb30: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
bb40: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
bb50: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
bb60: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
bb70: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
bb80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
bb90: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
bba0: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
bbb0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
bbc0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
bbd0: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
bbe0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
bbf0: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
bc00: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
bc10: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
bc20: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
bc30: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
bc40: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
bc50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bc60: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
bc70: 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64  ) );..  pVfs = d
bc80: 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  b->pVfs;.  p = s
bc90: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
bca0: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
bcb0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
bcc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
bcd0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
bce0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
bcf0: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
bd00: 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  b;..#if !defined
bd10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
bd20: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
bd30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bd40: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
bd50: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
bd60: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
bd70: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
bd80: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
bd90: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
bda0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
bdb0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
bdc0: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
bdd0: 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26  f( isMemdb==0 &&
bde0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
bdf0: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
be00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
be10: 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
be20: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
be30: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
be40: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
be50: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
be60: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
be70: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
be80: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
be90: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
bea0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
beb0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
bec0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
bed0: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
bee0: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
bef0: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66  dCache;.      if
bf00: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
bf10: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
bf20: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
bf30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bf40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
bf50: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
bf60: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
bf70: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
bf80: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
bf90: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
bfa0: 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
bfb0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
bfc0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
bfd0: 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
bfe0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
bff0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
c000: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
c010: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
c020: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
c030: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
c040: 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
c050: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c060: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
c070: 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
c080: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
c090: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
c0a0: 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
c0b0: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
c0c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
c0d0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
c0e0: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
c0f0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
c100: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
c110: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
c120: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
c130: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
c140: 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
c150: 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
c160: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
c170: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44            for(iD
c180: 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b=db->nDb-1; iDb
c190: 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20  >=0; iDb--){.   
c1a0: 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a           Btree *
c1b0: 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e  pExisting = db->
c1c0: 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
c1d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
c1e0: 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73  xisting && pExis
c1f0: 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29  ting->pBt==pBt )
c200: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
c210: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
c220: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
c230: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
c240: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
c250: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c270: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
c280: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
c290: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c2a0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
c2b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c2c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c2d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
c2e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c2f0: 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
c300: 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  Bt;.          pB
c310: 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  t->nRef++;.     
c320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c330: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c340: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
c350: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
c360: 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  red);.      sqli
c370: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
c380: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  thname);.    }.#
c390: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c3a0: 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
c3b0: 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d     /* In debug m
c3c0: 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c  ode, we mark all
c3d0: 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61   persistent data
c3e0: 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c  bases as sharabl
c3f0: 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
c400: 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f  when they are no
c410: 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73  t.  This exercis
c420: 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
c430: 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ode and.      **
c440: 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f   gives more oppo
c450: 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65  rtunity for asse
c460: 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  rts(sqlite3_mute
c470: 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20  x_held()).      
c480: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  ** statements to
c490: 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72   find locking pr
c4a0: 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f  oblems..      */
c4b0: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
c4c0: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  le = 1;.    }.#e
c4d0: 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
c4e0: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
c4f0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
c500: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
c510: 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
c520: 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
c530: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
c540: 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  are.    ** the r
c550: 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
c560: 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
c570: 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
c580: 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
c590: 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
c5a0: 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ing on a differe
c5b0: 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nt architecture.
c5c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
c5d0: 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d  rt( sizeof(i64)=
c5e0: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34  =8 || sizeof(i64
c5f0: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
c600: 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
c610: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34  =8 || sizeof(u64
c620: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
c630: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
c640: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
c650: 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
c660: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c670: 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
c680: 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
c690: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
c6a0: 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
c6b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
c6c0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
c6d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c6e0: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
c6f0: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
c700: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
c710: 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
c720: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
c730: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
c760: 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a  ags, vfsFlags);.
c770: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c780: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
c790: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c7a0: 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
c7b0: 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
c7c0: 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
c7d0: 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
c7e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c7f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
c800: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
c810: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
c820: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73  ->db = db;.    s
c830: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
c840: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
c850: 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
c860: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
c870: 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
c880: 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71  = pBt;.  .    sq
c890: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
c8a0: 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65  niter(pBt->pPage
c8b0: 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  r, pageReinit);.
c8c0: 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
c8d0: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
c8e0: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
c8f0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73  Bt->readOnly = s
c900: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
c910: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
c920: 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  r);.    pBt->pag
c930: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
c940: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
c950: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
c960: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
c970: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
c980: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
c990: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
c9a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
c9b0: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
c9c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
c9d0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
c9e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c9f0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
ca00: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
ca10: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
ca20: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
ca30: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
ca40: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
ca50: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
ca60: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
ca70: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
ca80: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
ca90: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
caa0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
cab0: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
cac0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
cad0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
cae0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
caf0: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
cb00: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
cb10: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
cb20: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
cb30: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
cb40: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
cb50: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
cb60: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
cb70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
cb80: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
cb90: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
cba0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
cbb0: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
cbc0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
cbd0: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
cbe0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
cbf0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
cc00: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
cc10: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
cc20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
cc30: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
cc40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
cc50: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
cc60: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
cc70: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
cc80: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
cc90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
cca0: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
ccb0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
ccc0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
ccd0: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
cce0: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
ccf0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
cd00: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
cd10: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
cd20: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
cd30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
cd40: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
cd50: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
cd60: 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
cd70: 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
cd80: 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
cd90: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
cda0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
cdb0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
cdc0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
cdd0: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
cde0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
cdf0: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
ce00: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
ce10: 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
ce20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ce30: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
ce40: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
ce50: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
ce60: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
ce70: 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
ce80: 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
ce90: 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
cea0: 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
ceb0: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
cec0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
ced0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
cee0: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
cef0: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
cf00: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
cf10: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
cf20: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
cf30: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
cf40: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
cf50: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
cf60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
cf70: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
cf80: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
cf90: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
cfa0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
cfb0: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
cfc0: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
cfd0: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
cfe0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cff0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
d000: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d010: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
d020: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
d030: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
d040: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d050: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d060: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
d070: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
d080: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
d090: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
d0a0: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
d0b0: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
d0c0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
d0d0: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
d0e0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
d0f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
d100: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
d110: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
d120: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d130: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
d140: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
d150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
d160: 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
d170: 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
d180: 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
d190: 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
d1a0: 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
d1b0: 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
d1c0: 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
d1d0: 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
d1e0: 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
d1f0: 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
d200: 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
d210: 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
d220: 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
d230: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
d240: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
d250: 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
d260: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
d270: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d280: 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
d290: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
d2a0: 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
d2b0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
d2c0: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
d2d0: 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
d2e0: 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
d2f0: 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
d300: 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
d310: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
d320: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
d330: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
d340: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
d350: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
d360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d370: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
d380: 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
d390: 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
d3a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
d3b0: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
d3c0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
d3d0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
d3e0: 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
d3f0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
d400: 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
d410: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
d420: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
d430: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
d440: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
d450: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
d460: 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
d470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d480: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d490: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
d4a0: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
d4b0: 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
d4c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d4d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
d4e0: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
d4f0: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
d500: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
d510: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
d520: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
d530: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
d540: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
d550: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
d560: 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
d570: 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
d580: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d590: 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
d5a0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
d5b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
d5c0: 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
d5d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d5e0: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
d5f0: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
d600: 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
d610: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
d620: 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
d630: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
d640: 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
d650: 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
d660: 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
d670: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
d680: 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
d690: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
d6a0: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
d6b0: 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
d6c0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
d6d0: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
d6e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
d6f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d700: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
d710: 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  E.  sqlite3_mute
d720: 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74  x *pMaster;.  Bt
d730: 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
d740: 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
d750: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
d760: 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
d770: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
d780: 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71  ;.  pMaster = sq
d790: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
d7a0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
d7b0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73  TIC_MASTER);.  s
d7c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d7d0: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
d7e0: 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
d7f0: 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
d800: 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
d810: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
d820: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
d830: 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
d840: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
d850: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
d860: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
d870: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
d880: 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
d890: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
d8a0: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
d8b0: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
d8c0: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
d8d0: 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
d8e0: 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
d8f0: 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
d900: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
d910: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
d920: 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
d930: 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
d940: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
d950: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d960: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
d970: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
d980: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
d990: 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
d9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
d9b0: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
d9c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d9d0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
d9e0: 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
d9f0: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
da00: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
da10: 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
da20: 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
da30: 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
da40: 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
da50: 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e  SIZE(pBt) bytes.
da60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
da70: 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
da80: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
da90: 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
daa0: 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
dab0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
dac0: 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
dad0: 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
dae0: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
daf0: 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
db00: 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
db10: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
db20: 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
db30: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
db40: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
db50: 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ee( pBt->pTmpSpa
db60: 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70  ce);.  pBt->pTmp
db70: 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Space = 0;.}../*
db80: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
db90: 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
dba0: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
dbb0: 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
dbc0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
dbd0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
dbe0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
dbf0: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
dc00: 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
dc10: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
dc20: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
dc30: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
dc40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
dc50: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
dc60: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
dc70: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
dc80: 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
dc90: 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
dca0: 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
dcb0: 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
dcc0: 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
dcd0: 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
dce0: 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
dcf0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
dd00: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
dd10: 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
dd20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
dd30: 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
dd40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
dd50: 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
dd60: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
dd70: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
dd80: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
dd90: 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
dda0: 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
ddb0: 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
ddc0: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
ddd0: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
dde0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
ddf0: 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
de00: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
de10: 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
de20: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
de30: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
de40: 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
de50: 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
de60: 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
de70: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
de80: 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
de90: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
dea0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
deb0: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
dec0: 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
ded0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
dee0: 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
def0: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
df00: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
df10: 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
df20: 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
df30: 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
df40: 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
df50: 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
df60: 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
df70: 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
df80: 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
df90: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
dfa0: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
dfb0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
dfc0: 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
dfd0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
dfe0: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
dff0: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
e000: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
e010: 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
e020: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
e030: 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
e040: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
e050: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e060: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
e070: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
e080: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
e090: 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
e0a0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
e0b0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e0c0: 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
e0d0: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
e0e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
e0f0: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
e100: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
e110: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
e120: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
e130: 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
e140: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
e150: 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
e160: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
e170: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e180: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
e190: 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
e1a0: 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
e1b0: 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
e1c0: 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
e1d0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
e1e0: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
e1f0: 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
e200: 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
e210: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
e220: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
e230: 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
e240: 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
e250: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
e260: 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
e270: 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
e280: 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
e290: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
e2a0: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
e2b0: 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
e2c0: 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
e2d0: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
e2e0: 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
e2f0: 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
e300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
e310: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
e320: 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
e330: 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
e340: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
e350: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
e360: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
e370: 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
e380: 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
e390: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
e3a0: 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
e3b0: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
e3c0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
e3d0: 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
e3e0: 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
e3f0: 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
e400: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
e410: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
e420: 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
e430: 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
e440: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
e450: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
e460: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
e470: 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
e480: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
e490: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e4a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
e4b0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
e4c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e4d0: 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
e4e0: 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
e4f0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
e500: 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
e510: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
e520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e530: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
e540: 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
e550: 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
e560: 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
e570: 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
e580: 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
e590: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
e5a0: 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
e5b0: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
e5c0: 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
e5d0: 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
e5e0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
e5f0: 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
e600: 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
e610: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
e620: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
e630: 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
e640: 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
e650: 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
e660: 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
e670: 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
e680: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
e690: 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
e6a0: 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
e6b0: 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
e6c0: 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
e6d0: 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
e6e0: 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
e6f0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
e700: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
e710: 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
e720: 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
e730: 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20  Level(Btree *p, 
e740: 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
e750: 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68  ullSync){.  BtSh
e760: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
e770: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
e780: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e790: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
e7a0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
e7b0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
e7c0: 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
e7d0: 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
e7e0: 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
e7f0: 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
e800: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
e810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e820: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
e830: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
e840: 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
e850: 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
e860: 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
e870: 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
e880: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
e890: 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
e8a0: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
e8b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e8c0: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
e8d0: 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
e8e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
e8f0: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
e900: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e910: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
e920: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
e930: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
e940: 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
e950: 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
e960: 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
e970: 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
e980: 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
e990: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
e9a0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
e9b0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
e9c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e9d0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
e9e0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
e9f0: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
ea00: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
ea10: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
ea20: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
ea30: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
ea40: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
ea50: 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
ea60: 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
ea70: 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
ea80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
ea90: 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
eaa0: 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
eab0: 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
eac0: 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
ead0: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
eae0: 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
eaf0: 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
eb00: 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
eb10: 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
eb20: 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
eb30: 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
eb40: 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
eb50: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
eb60: 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
eb70: 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
eb80: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
eb90: 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
eba0: 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
ebb0: 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
ebc0: 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
ebd0: 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
ebe0: 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
ebf0: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
ec00: 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
ec10: 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
ec20: 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
ec30: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
ec40: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
ec50: 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
ec60: 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
ec70: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
ec80: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
ec90: 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
eca0: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
ecb0: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
ecc0: 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
ecd0: 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65 46  en the pageSizeF
ece0: 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  ixed flag is set
ecf0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
ed00: 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
ed10: 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
ed20: 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
ed30: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
ed40: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
ed50: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
ed60: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
ed70: 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
ed80: 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
ed90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
eda0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
edb0: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
edc0: 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
edd0: 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
ede0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
edf0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
ee00: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
ee10: 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
ee20: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
ee30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ee40: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
ee50: 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
ee60: 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
ee70: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
ee80: 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
ee90: 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
eea0: 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
eeb0: 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
eec0: 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
eed0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
eee0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
eef0: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
ef00: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
ef10: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
ef20: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
ef30: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
ef40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
ef50: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
ef60: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
ef70: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
ef80: 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
ef90: 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
efa0: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
efb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
efc0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
efd0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
efe0: 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
eff0: 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
f000: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
f010: 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
f020: 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
f030: 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53  Fix ) pBt->pageS
f040: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20  izeFixed = 1;.  
f050: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
f060: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
f070: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
f080: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
f090: 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
f0a0: 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
f0b0: 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
f0c0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
f0d0: 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
f0e0: 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
f0f0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
f100: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
f110: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
f120: 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
f130: 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
f140: 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
f150: 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
f160: 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
f170: 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
f180: 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
f190: 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
f1a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
f1b0: 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
f1c0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
f1d0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
f1e0: 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
f1f0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
f200: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
f210: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
f220: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
f230: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
f240: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
f250: 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
f260: 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
f270: 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
f280: 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
f290: 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
f2a0: 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
f2b0: 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
f2c0: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
f2d0: 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
f2e0: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
f2f0: 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
f300: 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
f310: 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
f320: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
f330: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
f340: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
f350: 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
f360: 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
f370: 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
f380: 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
f390: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
f3a0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e   return n;.}.#en
f3b0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
f3c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
f3d0: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
f3e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f3f0: 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
f400: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
f410: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
f420: 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
f430: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
f440: 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
f450: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
f460: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
f470: 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
f480: 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
f490: 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
f4a0: 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
f4b0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
f4c0: 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
f4d0: 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
f4e0: 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
f4f0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
f500: 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
f510: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f520: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
f530: 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
f540: 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
f550: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f560: 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
f570: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
f580: 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
f590: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
f5a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f5b0: 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
f5c0: 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
f5d0: 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
f5e0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
f5f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
f600: 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  ed && (av ?1:0)!
f610: 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
f620: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
f630: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
f640: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
f650: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
f660: 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
f670: 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
f680: 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
f690: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
f6a0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
f6b0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
f6c0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
f6d0: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
f6e0: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
f6f0: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
f700: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
f710: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
f720: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
f730: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
f740: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
f750: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
f760: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f770: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
f780: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
f790: 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
f7a0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
f7b0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
f7c0: 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
f7d0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
f7e0: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
f7f0: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
f800: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
f810: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
f820: 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
f830: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
f840: 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
f850: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
f860: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
f870: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
f880: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
f890: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
f8a0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
f8b0: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
f8c0: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
f8d0: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
f8e0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
f8f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
f900: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
f910: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
f920: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
f930: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
f940: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f950: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
f960: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
f970: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
f980: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
f990: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
f9a0: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
f9b0: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
f9c0: 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
f9d0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
f9e0: 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
f9f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
fa00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
fa10: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
fa20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fa30: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
fa40: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
fa50: 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
fa60: 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
fa70: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
fa80: 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
fa90: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
faa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
fab0: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
fac0: 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
fad0: 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
fae0: 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
faf0: 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
fb00: 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
fb10: 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63  file. .  */.  rc
fb20: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
fb30: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
fb40: 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
fb50: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fb60: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70  OK ){.    goto p
fb70: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
fb80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50  ;.  }else if( nP
fb90: 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  age>0 ){.    int
fba0: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69   pageSize;.    i
fbb0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  nt usableSize;. 
fbc0: 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
fbd0: 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
fbe0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
fbf0: 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65  TADB;.    if( me
fc00: 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
fc10: 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
fc20: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
fc30: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
fc40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fc50: 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
fc60: 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e       pBt->readOn
fc70: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ly = 1;.    }.  
fc80: 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
fc90: 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
fca0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
fcb0: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
fcc0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
fcd0: 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
fce0: 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
fcf0: 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
fd00: 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
fd10: 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
fd20: 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
fd30: 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
fd40: 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
fd50: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
fd60: 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
fd70: 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
fd80: 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
fd90: 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
fda0: 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
fdb0: 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
fdc0: 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
fdd0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
fde0: 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
fdf0: 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
fe00: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
fe10: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
fe20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
fe30: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
fe40: 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20  page1[16]);.    
fe50: 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31  if( ((pageSize-1
fe60: 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c  )&pageSize)!=0 |
fe70: 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  | pageSize<512 |
fe80: 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49 54  |.        (SQLIT
fe90: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c  E_MAX_PAGE_SIZE<
fea0: 33 32 37 36 38 20 26 26 20 70 61 67 65 53 69 7a  32768 && pageSiz
feb0: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
fec0: 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20  E_SIZE).    ){. 
fed0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
fee0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
fef0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
ff00: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
ff10: 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   );.    usableSi
ff20: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
ff30: 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
ff40: 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74  f( pageSize!=pBt
ff50: 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
ff60: 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
ff70: 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
ff80: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
ff90: 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
ffa0: 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
ffb0: 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
ffc0: 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
ffd0: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
ffe0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
fff0: 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
10000 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
10010 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
10020 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
10030 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
10040 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
10050 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
10060 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
10070 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
10080 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
10090 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
100a0 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
100b0 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
100c0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
100d0 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
100e0 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65  ze = (u16)usable
100f0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
10100 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
10110 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  )pageSize;.     
10120 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10130 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
10140 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10150 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
10160 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
10170 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
101a0 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
101b0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
101c0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
101d0 6c 65 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72  led;.      retur
101e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
101f0 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c   }.    if( usabl
10200 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
10210 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
10220 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
10230 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
10240 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
10250 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
10260 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75  bleSize = (u16)u
10270 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
10280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10290 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
102a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
102b0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
102c0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
102d0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
102e0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
102f0 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
10300 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
10310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
10320 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
10330 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
10340 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
10350 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
10360 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
10370 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
10380 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
10390 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
103a0 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
103b0 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
103c0 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
103d0 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
103e0 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
103f0 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
10400 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
10410 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
10420 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
10430 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
10440 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
10450 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
10460 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
10470 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
10480 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
10490 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
104a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
104b0 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
104c0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
104d0 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c  a 2-byte poiner,
104e0 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
104f0 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
10500 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
10510 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
10520 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
10530 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
10540 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
10550 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
10560 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
10570 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
10580 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
10590 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 23;.  pBt->mi
105a0 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  nLocal = (pBt->u
105b0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
105c0 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
105d0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
105e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
105f0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
10600 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
10610 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
10620 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70   23;.  assert( p
10630 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
10640 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
10650 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
10660 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
10670 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10680 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
10690 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
106a0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
106b0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
106c0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
106d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
106e0 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
106f0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63   lockBtree() exc
10700 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f  ept that it also
10710 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
10720 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
10730 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63   there is lock c
10740 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ontention..*/.st
10750 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
10760 65 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65  eeWithRetry(Btre
10770 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20  e *pRef){.  int 
10780 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10790 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
107a0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
107b0 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28  x(pRef) );.  if(
107c0 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d   pRef->inTrans==
107d0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
107e0 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69    u8 inTransacti
107f0 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e  on = pRef->pBt->
10800 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
10810 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
10820 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20  y(pRef);.    rc 
10830 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
10840 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30  ginTrans(pRef, 0
10850 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74  );.    pRef->pBt
10860 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
10870 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  = inTransaction;
10880 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61  .    pRef->inTra
10890 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
108a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
108b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
108c0 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  pRef->pBt->nTran
108d0 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d  saction--;.    }
108e0 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
108f0 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20  ity(pRef);.  }. 
10900 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20   return rc;.}.  
10910 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20       ../*.** If 
10920 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
10930 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
10940 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
10950 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
10960 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
10970 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
10980 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
10990 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
109a0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
109b0 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
109c0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
109d0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
109e0 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
109f0 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
10a00 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
10a10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
10a20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  are any outstand
10a30 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69  ing cursors, thi
10a40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10a50 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
10a60 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
10a70 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
10a80 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10a90 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10aa0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
10ab0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
10ac0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10ad0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10ae0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10af0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
10b00 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
10b10 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
10b20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  && pBt->pCursor=
10b30 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  =0 && pBt->pPage
10b40 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  1!=0 ){.    if( 
10b50 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
10b60 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
10b70 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73  )>=1 ){.      as
10b80 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
10b90 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
10ba0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
10bb0 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
10bc0 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  }.    pBt->pPage
10bd0 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1 = 0;.  }.}../*
10be0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
10bf0 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
10c00 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
10c10 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a  rst page of the.
10c20 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
10c30 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
10c40 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
10c50 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10c60 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
10c70 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
10c80 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  rc;.  int nPage;
10c90 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
10ca0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10cb0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10cc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10cd0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
10ce0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
10cf0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10d00 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20  E_OK || nPage>0 
10d10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10d20 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
10d30 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
10d40 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
10d50 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
10d60 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
10d70 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
10d80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
10d90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
10da0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
10db0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
10dc0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
10dd0 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
10de0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
10df0 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75  der)==16 );.  pu
10e00 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d  t2byte(&data[16]
10e10 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
10e20 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
10e30 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
10e40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
10e50 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
10e60 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
10e70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
10e80 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
10e90 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
10ea0 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
10eb0 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
10ec0 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
10ed0 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
10ee0 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
10ef0 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
10f00 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
10f10 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
10f20 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
10f30 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
10f40 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
10f50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
10f60 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
10f70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
10f80 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
10f90 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
10fa0 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
10fb0 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
10fc0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
10fd0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
10fe0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
10ff0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
11000 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
11010 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
11020 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
11030 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
11040 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
11050 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
11060 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11070 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
11080 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
11090 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
110a0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
110b0 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
110c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
110d0 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
110e0 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
110f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
11100 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
11110 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
11120 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
11130 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
11140 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
11150 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
11160 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
11170 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
11180 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
11190 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
111a0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
111b0 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
111c0 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
111d0 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
111e0 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
111f0 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
11200 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
11210 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
11220 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
11230 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
11240 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
11250 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
11260 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
11270 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
11280 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
11290 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
112a0 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
112b0 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
112c0 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
112d0 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
112e0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
112f0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
11300 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
11310 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
11320 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
11330 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
11340 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
11350 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
11360 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
11370 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
11380 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
11390 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
113a0 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
113b0 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
113c0 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
113d0 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
113e0 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
113f0 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
11400 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
11410 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
11420 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
11430 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
11440 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
11450 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
11460 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
11470 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
11480 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
11490 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
114a0 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
114b0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
114c0 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
114d0 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
114e0 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
114f0 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
11500 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
11510 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
11520 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
11530 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
11540 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
11550 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
11560 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
11570 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
11580 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
11590 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
115a0 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
115b0 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
115c0 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
115d0 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
115e0 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
115f0 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
11600 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
11610 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
11620 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
11630 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
11640 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
11650 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
11660 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
11670 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
11680 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
11690 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
116a0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
116b0 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
116c0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
116d0 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
116e0 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
116f0 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
11700 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11710 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
11720 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
11730 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  flag){.  sqlite3
11740 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
11750 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11760 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
11770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
11780 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11790 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
117a0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
117b0 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
117c0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
117d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
117e0 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
117f0 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
11800 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
11810 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
11820 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
11830 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
11840 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
11850 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
11860 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
11870 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
11880 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
11890 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
118a0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
118b0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
118c0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
118d0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
118e0 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
118f0 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
11900 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
11910 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
11920 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11930 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
11940 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
11950 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
11960 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
11970 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
11980 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
11990 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
119a0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
119b0 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
119c0 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
119d0 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
119e0 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
119f0 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
11a00 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
11a10 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
11a20 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c    */.  if( (wrfl
11a30 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
11a40 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
11a50 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69  WRITE) || pBt->i
11a60 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20  sPending ){.    
11a70 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
11a80 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
11a90 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
11aa0 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
11ab0 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
11ac0 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
11ad0 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
11ae0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
11af0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
11b00 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
11b10 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
11b20 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
11b30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11b40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
11b50 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
11b60 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
11b70 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
11b80 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
11b90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
11ba0 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
11bb0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
11bc0 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
11bd0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ..  do {.    /* 
11be0 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
11bf0 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
11c00 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
11c10 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
11c20 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
11c30 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
11c40 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
11c50 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
11c60 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
11c70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
11c80 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
11c90 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
11ca0 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
11cb0 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
11cc0 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
11cd0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
11ce0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
11cf0 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
11d00 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
11d10 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
11d20 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
11d30 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
11d40 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
11d50 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
11d60 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
11d70 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
11d80 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
11d90 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
11da0 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
11db0 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
11dc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11dd0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
11de0 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
11df0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
11e00 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
11e10 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
11e20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11e30 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
11e40 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
11e50 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
11e60 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
11e70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
11e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11e90 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
11ea0 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
11eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11ec0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
11ed0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11ee0 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
11ef0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
11f00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
11f10 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
11f20 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
11f30 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
11f40 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
11f50 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
11f60 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
11f70 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
11f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
11f90 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
11fa0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
11fb0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
11fc0 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on++;.    }.    
11fd0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
11fe0 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
11ff0 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
12000 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12010 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
12020 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
12030 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
12040 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
12050 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
12060 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12070 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66  ACHE.    if( wrf
12080 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  lag ){.      ass
12090 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
120a0 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
120b0 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
120c0 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75      pBt->isExclu
120d0 73 69 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c  sive = (u8)(wrfl
120e0 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ag>1);.    }.#en
120f0 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f  dif.  }...trans_
12100 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
12110 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
12120 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
12130 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
12140 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
12150 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
12160 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
12170 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
12180 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
12190 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
121a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
121b0 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
121c0 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
121d0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
121e0 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
121f0 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
12200 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
12210 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
12220 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
12230 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
12240 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
12250 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
12260 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12270 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12280 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
12290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
122a0 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
122b0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
122c0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
122d0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
122e0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
122f0 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
12300 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
12310 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
12320 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
12330 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
12340 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
12350 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
12360 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
12370 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
12380 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
12390 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
123c0 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
123d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12400 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
12410 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
12420 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12440 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
12450 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
12460 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
12470 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
12480 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
12490 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
124a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
124b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
124c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
124d0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
124e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
124f0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
12500 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
12510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12520 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
12530 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
12540 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
12550 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
12560 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
12570 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
12580 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
12590 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20  ge, i);..    rc 
125a0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
125b0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
125c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
125d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
125e0 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
125f0 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
12600 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
12610 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
12620 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
12630 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
12640 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  l);.      rc = p
12650 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
12660 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
12670 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
12680 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12690 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74  TE_OK ) goto set
126a0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
126b0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
126c0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
126d0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
126e0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
126f0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
12700 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12710 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  t+8]);.    rc = 
12720 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
12730 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
12740 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
12750 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
12760 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
12770 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
12780 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
12790 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
127a0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
127b0 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  e, which is guar
127c0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62  anteed to be a b
127d0 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61  tree page, not a
127e0 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
127f0 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ge, is a pointer
12800 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
12810 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
12820 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
12830 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e  oints to.** iTo.
12840 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
12850 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
12860 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
12870 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  o be modified, a
12880 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s .** follows:.*
12890 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
128a0 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
128b0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
128c0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
128d0 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128f0 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
12900 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
12910 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
12920 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
12930 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
12940 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
12950 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
12960 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
12970 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
12980 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
12990 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
129a0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
129b0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
129c0 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
129d0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
129e0 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
129f0 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
12a00 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
12a10 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
12a20 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
12a30 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
12a40 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
12a50 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
12a60 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
12a70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12a80 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
12a90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
12aa0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12ab0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
12ac0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
12ad0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
12ae0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
12af0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
12b00 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
12b10 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
12b20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
12b30 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
12b40 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
12b50 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
12b60 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
12b70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12b80 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
12b90 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
12ba0 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
12bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
12bc0 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
12bd0 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
12be0 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
12bf0 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Cell;..    sqlit
12c00 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
12c10 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c  pPage);.    nCel
12c20 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
12c30 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
12c40 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
12c50 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
12c60 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
12c70 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
12c80 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
12c90 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
12ca0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
12cb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12cc0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
12cd0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
12ce0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
12cf0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
12d00 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
12d10 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
12d20 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
12d30 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
12d40 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
12d50 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
12d60 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
12d70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
12d80 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
12d90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12db0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
12dc0 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
12dd0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
12de0 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
12df0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12e00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12e10 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
12e20 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
12e30 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
12e40 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
12e50 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
12e60 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
12e70 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12e80 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
12e90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12ea0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12eb0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
12ec0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
12ed0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
12ee0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
12ef0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
12f00 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
12f10 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
12f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12f30 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
12f40 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
12f50 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
12f60 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
12f70 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
12f80 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
12f90 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
12fa0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
12fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
12fc0 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
12fd0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
12fe0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
12ff0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
13000 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
13010 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
13020 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
13030 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
13040 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
13050 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
13060 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
13070 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
13080 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
13090 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
130a0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
130b0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
130c0 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
130d0 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
130e0 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
130f0 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
13100 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  ommit.){.  MemPa
13110 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
13120 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
13130 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
13140 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
13150 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
13160 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
13170 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
13180 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
13190 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
131a0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
131b0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
131c0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
131d0 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
131e0 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
131f0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
13200 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
13210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13220 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13230 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
13240 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
13250 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
13260 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
13270 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
13280 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
13290 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
132a0 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
132b0 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
132c0 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
132d0 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
132e0 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
132f0 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
13300 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
13310 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
13320 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
13330 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
13340 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
13350 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
13360 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
13370 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
13390 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
133a0 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
133b0 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
133c0 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
133d0 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
133e0 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
133f0 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
13400 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
13410 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
13420 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
13430 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
13440 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
13450 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
13460 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
13470 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
13480 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
13490 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
134a0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
134b0 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
134c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
134d0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
134e0 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
134f0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
13500 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
13510 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
13520 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
13530 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
13540 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
13550 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
13560 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
13570 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
13580 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
13590 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
135a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
135b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
135c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
135d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
135e0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
135f0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
13600 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
13610 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
13620 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l!=0 ){.      rc
13630 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
13640 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
13650 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
13660 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20  reePage);.      
13670 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13680 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
13690 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
136a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
136b0 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
136c0 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
136d0 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
136e0 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
136f0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
13700 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
13710 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
13720 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
13730 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
13740 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
13750 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
13760 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
13770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
13780 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
13790 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
137a0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
137b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
137c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
137d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
137e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
137f0 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
13800 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
13810 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13820 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13830 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
13840 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13850 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
13860 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
13870 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
13880 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
13890 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
138a0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
138b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
138c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
138d0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
138e0 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
138f0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b  Type, iPtrPage);
13900 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13910 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
13920 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
13930 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
13940 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
13950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
13960 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
13970 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
13980 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
13990 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
139a0 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
139b0 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
139c0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
139d0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
139e0 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
139f0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
13a00 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
13a10 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
13a20 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61  o.** point in ca
13a30 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
13a40 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
13a50 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
13a60 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
13a70 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
13a80 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
13a90 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
13aa0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f   .** database so
13ab0 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
13ac0 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
13ad0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
13ae0 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
13af0 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49   in use..**.** I
13b00 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d  f the nFin param
13b10 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
13b20 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
13b30 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20  tion assumes.** 
13b40 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
13b50 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
13b60 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
13b70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72  () until.** it r
13b80 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
13b90 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20  NE or an error, 
13ba0 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73  and that nFin is
13bb0 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
13bc0 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61  f pages the data
13bd0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63  base file will c
13be0 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69  ontain after thi
13bf0 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  s .** process is
13c00 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74   complete..*/.st
13c10 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
13c20 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
13c30 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
13c40 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b  , Pgno iLastPg){
13c50 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
13c60 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
13c70 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
13c80 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
13c90 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
13ca0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13cb0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
13cc0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
13cd0 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
13ce0 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
13cf0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
13d00 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
13d10 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
13d20 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69  GE(pBt) ){.    i
13d30 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54  nt rc;.    u8 eT
13d40 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
13d50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
13d60 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
13d70 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
13d80 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
13d90 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
13da0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13db0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
13dc0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
13dd0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
13de0 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
13df0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
13e00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13e10 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13e20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
13e30 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
13e40 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
13e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13e60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
13e70 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
13e80 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
13e90 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
13ea0 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
13eb0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
13ec0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
13ed0 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
13ee0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
13ef0 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
13f00 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d   if nFin is non-
13f10 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
13f20 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
13f30 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
13f40 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
13f50 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
13f60 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
13f70 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
13f80 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
13f90 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
13fa0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
13fb0 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
13fc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13fd0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
13fe0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
13ff0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
14000 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
14010 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
14020 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
14030 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a  g, iLastPg, 1);.
14040 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
14050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14060 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
14070 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14080 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
14090 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
140a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
140b0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
140c0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
140d0 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
140e0 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
140f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
14100 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
14110 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
14120 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
14130 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63  astPg;..      rc
14140 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
14150 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
14160 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
14170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14190 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
141a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
141b0 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  /* If nFin is ze
141c0 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
141d0 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
141e0 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
141f0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
14200 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
14210 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
14220 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
14230 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
14240 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
14250 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
14260 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20  nFin is greater 
14270 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
14280 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
14290 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
142a0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
142b0 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
142c0 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
142d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
142e0 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
142f0 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   */.      do {. 
14300 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
14310 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
14320 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
14330 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
14340 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
14350 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
14360 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14370 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
14380 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
14390 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
143a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
143b0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
143c0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
143d0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
143e0 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65  nFin!=0 && iFree
143f0 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
14400 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
14410 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
14420 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
14430 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
14440 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65  pLastPg->pDbPage
14450 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
14460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14470 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
14480 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
14490 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
144a0 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
144b0 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20  nFin!=0);.      
144c0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
144d0 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
144e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
144f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14500 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
14520 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
14530 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
14540 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50     while( iLastP
14550 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
14560 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41  PAGE(pBt)||PTRMA
14570 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
14580 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20  astPg) ){.      
14590 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
145a0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
145b0 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  ){.        MemPa
145c0 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20  ge *pPg;.       
145d0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
145e0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
145f0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67  t, iLastPg, &pPg
14600 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
14610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
14630 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
14640 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
14650 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
14660 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
14670 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
14680 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
14690 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
146a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
146b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
146c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
146d0 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
146e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
146f0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
14700 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
14710 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20  iLastPg);.  }.  
14720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
14740 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
14750 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
14760 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
14770 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
14780 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
14790 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
147a0 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
147b0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
147c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
147d0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
147e0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
147f0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
14800 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
14810 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
14820 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
14830 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
14840 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
14850 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
14860 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
14870 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
14880 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
14890 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
148a0 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
148b0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
148c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
148d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
148e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
148f0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
14900 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14910 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
14920 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
14930 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
14940 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
14950 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
14960 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
14970 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  lse{.    invalid
14980 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
14990 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  che(pBt);.    rc
149a0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
149b0 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72 50  p(pBt, 0, pagerP
149c0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a  agecount(pBt));.
149d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
149e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
149f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14a00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14a10 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
14a20 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
14a30 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
14a40 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
14a50 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mmited for an au
14a60 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
14a70 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
14a80 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14a90 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
14aa0 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
14ab0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
14ac0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14ad0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
14ae0 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
14af0 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
14b00 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
14b10 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
14b20 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
14b30 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
14b40 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
14b50 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
14b60 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
14b70 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
14b80 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
14b90 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
14ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
14bb0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
14bc0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41  t->pPager;.  VVA
14bd0 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20  _ONLY( int nRef 
14be0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
14bf0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
14c00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
14c10 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14c20 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14c30 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
14c40 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
14c50 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
14c60 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
14c70 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
14c80 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
14c90 6e 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  nFin;.    Pgno n
14ca0 46 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  Free;.    Pgno n
14cb0 50 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e 6f  Ptrmap;.    Pgno
14cc0 20 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73   iFree;.    cons
14cd0 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74  t int pgsz = pBt
14ce0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
14cf0 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61 67  Pgno nOrig = pag
14d00 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
14d10 3b 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  ;..    if( PTRMA
14d20 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
14d30 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
14d40 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
14d50 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
14d60 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
14d70 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
14d80 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
14d90 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
14da0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
14db0 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
14dc0 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
14dd0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
14de0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
14df0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
14e00 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
14e10 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
14e20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
14e30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14e40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
14e50 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
14e60 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
14e70 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
14e80 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46     nPtrmap = (nF
14e90 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
14ea0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
14eb0 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73  ig)+pgsz/5)/(pgs
14ec0 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  z/5);.    nFin =
14ed0 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
14ee0 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
14ef0 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
14f00 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
14f10 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
14f20 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
14f30 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
14f40 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
14f50 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
14f60 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
14f70 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
14f80 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
14f90 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
14fa0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
14fb0 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
14fc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
14fd0 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
14fe0 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
14ff0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
15000 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
15010 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
15020 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
15030 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
15040 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
15050 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
15060 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
15070 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
15080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15090 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
150a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
150b0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
150c0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
150d0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
150e0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
150f0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
15100 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
15110 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
15120 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
15130 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
15140 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
15150 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
15160 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15170 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
15180 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
15190 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
151a0 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
151b0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
151c0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
151d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
151e0 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
151f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
15200 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
15210 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
15220 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
15230 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
15240 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
15250 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
15260 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
15270 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
15280 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
15290 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
152a0 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
152b0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
152c0 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
152d0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
152e0 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
152f0 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
15300 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
15310 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
15320 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
15330 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
15340 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
15350 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
15360 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
15370 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
15380 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
15390 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
153a0 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
153b0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
153c0 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
153d0 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
153e0 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
153f0 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
15400 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
15410 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
15420 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
15430 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
15440 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
15450 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
15460 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
15470 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
15480 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
15490 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
154a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
154b0 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
154c0 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
154d0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
154e0 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
154f0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
15500 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
15510 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
15520 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
15530 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
15540 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
15550 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
15560 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
15570 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
15580 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
15590 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
155a0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
155b0 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
155c0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
155d0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
155e0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
155f0 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
15600 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
15610 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
15620 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
15630 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
15640 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
15650 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
15660 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
15670 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
15680 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
15690 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
156a0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
156b0 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
156c0 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
156d0 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
156e0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
156f0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
15700 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
15710 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
15720 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
15730 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
15740 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
15750 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
15760 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
15770 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
15780 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
15790 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
157a0 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
157b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
157c0 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
157d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
157e0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
157f0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
15800 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15810 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
15820 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15830 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
15840 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
15850 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
15860 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
15870 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
15880 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
15890 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
158a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
158b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
158c0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
158d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
158e0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
158f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15900 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
15910 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
15920 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
15930 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
15940 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
15950 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15960 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
15970 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
15980 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
15990 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
159a0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
159b0 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
159c0 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
159d0 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
159e0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
159f0 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
15a00 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
15a10 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
15a20 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
15a30 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
15a40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
15a50 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
15a60 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
15a70 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
15a80 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
15a90 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
15aa0 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
15ab0 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
15ac0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
15ad0 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
15ae0 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
15af0 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
15b00 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
15b10 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
15b20 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
15b30 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
15b40 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
15b50 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
15b60 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
15b70 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
15b80 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
15b90 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
15ba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
15bb0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
15bc0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
15bd0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
15be0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
15bf0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
15c00 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
15c10 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
15c20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15c30 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
15c40 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
15c50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15c60 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
15c70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15c80 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
15c90 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
15ca0 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
15cb0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
15cc0 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
15cd0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
15ce0 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
15cf0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
15d00 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
15d10 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
15d20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
15d30 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
15d40 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
15d50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
15d60 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
15d70 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
15d80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
15d90 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
15da0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15db0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
15dc0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
15dd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15df0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15e00 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
15e10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
15e20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15e30 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
15e40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
15e50 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e  he handle has an
15e60 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
15e70 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
15e80 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61  ement the transa
15e90 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74  ction.  ** count
15ea0 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
15eb0 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
15ec0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72  nsaction count r
15ed0 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20  eaches 0, set.  
15ee0 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74  ** the shared st
15ef0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
15f00 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
15f10 65 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c  eeIfUnused() cal
15f20 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c  l below.  ** wil
15f30 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
15f40 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
15f50 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
15f60 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 63 6c 65  _NONE ){.    cle
15f70 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
15f80 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
15f90 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
15fa0 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tion--;.    if( 
15fb0 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
15fc0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
15fd0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15fe0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
15ff0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
16000 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
16010 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
16020 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
16030 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74  nd unlock.  ** t
16040 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73  he pager if this
16050 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
16060 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
16070 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
16080 0a 20 20 2a 2f 0a 20 20 62 74 72 65 65 43 6c 65  .  */.  btreeCle
16090 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
160a0 29 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  );.  p->inTrans 
160b0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
160c0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
160d0 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
160e0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
160f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16100 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16120 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
16130 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
16140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16150 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
16160 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
16170 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16180 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
16190 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
161a0 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
161b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
161c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
161d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
161e0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
161f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
16200 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16210 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
16220 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
16230 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
16240 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
16250 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
16260 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
16270 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
16280 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
16290 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
162a0 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
162b0 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
162c0 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
162d0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
162e0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
162f0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
16300 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
16310 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
16320 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
16330 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
16340 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
16350 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
16360 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
16370 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
16380 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
16390 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
163a0 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
163b0 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
163c0 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
163d0 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
163e0 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
163f0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
16400 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
16410 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
16420 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
16430 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
16440 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
16450 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
16460 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
16470 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
16480 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
16490 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
164a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
164b0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
164c0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
164d0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
164e0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
164f0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
16500 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
16510 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
16520 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
16530 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
16540 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
16550 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
16560 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
16570 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
16580 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
16590 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
165a0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
165b0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
165c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
165d0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
165e0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
165f0 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
16600 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
16610 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
16620 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
16630 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
16640 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
16650 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
16660 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
16670 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
16680 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
16690 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
166a0 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
166b0 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
166c0 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
166d0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
166e0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
166f0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
16700 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
16710 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
16720 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
16730 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
16740 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
16750 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
16760 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16770 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
16780 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
16790 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
167a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
167b0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
167c0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
167d0 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
167e0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
167f0 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65  .    p->skip = e
16800 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28  rrCode;.    for(
16810 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
16820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
16830 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
16840 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  age[i]);.      p
16850 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
16860 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
16870 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16880 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Btree);.}../*.**
16890 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
168a0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
168b0 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73  gress.  All curs
168c0 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  ors will be.** i
168d0 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73  nvalided by this
168e0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
168f0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
16900 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74  a cursor.** that
16910 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
16920 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
16930 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  is operation wil
16940 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  l result.** in a
16950 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
16960 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
16970 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
16980 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16990 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
169a0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
169b0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
169c0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
169d0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
169e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
169f0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b  lback(Btree *p){
16a00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
16a10 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16a20 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
16a30 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
16a40 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16a50 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  .  rc = saveAllC
16a60 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
16a70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
16a80 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
16a90 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51  CHE.  if( rc!=SQ
16aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
16ab0 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72  * This is a horr
16ac0 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20  ible situation. 
16ad0 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  An IO or malloc(
16ae0 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  ) error occurred
16af0 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74   whilst.    ** t
16b00 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75  rying to save cu
16b10 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20  rsor positions. 
16b20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
16b30 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b  tomatic rollback
16b40 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20   (as.    ** the 
16b50 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73  result of a cons
16b60 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29  traint, malloc()
16b70 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65   failure or IO e
16b80 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20  rror) then .    
16b90 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79  ** the cache may
16ba0 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69   be internally i
16bb0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74  nconsistent (not
16bc0 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74   contain valid t
16bd0 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20  rees) so.    ** 
16be0 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  we cannot simply
16bf0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
16c00 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  r to the caller.
16c10 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20   Instead, abort 
16c20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72  .    ** all quer
16c30 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ies that may be 
16c40 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65  using any of the
16c50 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61   cursors that fa
16c60 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20  iled to save..  
16c70 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
16c80 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
16c90 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a  ors(p, rc);.  }.
16ca0 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e  #endif.  btreeIn
16cb0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
16cc0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
16cd0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
16ce0 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
16cf0 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
16d00 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
16d10 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
16d20 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
16d30 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
16d40 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
16d50 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
16d60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
16d70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16d80 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
16d90 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
16da0 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
16db0 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
16dc0 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   ** call sqlite3
16dd0 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  BtreeGetPage() o
16de0 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
16df0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
16e00 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
16e10 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
16e20 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  y. */.    if( sq
16e30 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
16e40 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
16e50 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
16e60 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
16e70 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
16e80 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
16e90 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
16ea0 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20  rs(pBt)==0 );.  
16eb0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
16ec0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
16ed0 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  D;.  }..  if( p-
16ee0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
16ef0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 63 6c 65 61  NONE ){.    clea
16f00 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
16f10 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
16f20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
16f30 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
16f40 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
16f50 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
16f60 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
16f70 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
16f80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
16f90 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
16fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74  .    }.  }..  bt
16fb0 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
16fc0 6e 74 28 70 42 74 29 3b 0a 20 20 70 2d 3e 69 6e  nt(pBt);.  p->in
16fd0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
16fe0 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65  NE;.  unlockBtre
16ff0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
17000 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
17010 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
17020 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17030 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17040 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
17050 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
17060 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
17070 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e  nsaction can can
17080 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
17090 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
170a0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
170b0 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
170c0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
170d0 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
170e0 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
170f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
17100 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
17110 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
17120 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
17130 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
17140 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
17150 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
17160 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
17170 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
17180 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
17190 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
171a0 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
171b0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
171c0 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
171d0 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
171e0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
171f0 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
17200 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
17210 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
17220 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
17230 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
17240 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
17250 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
17260 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
17270 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
17280 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
17290 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
172a0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
172b0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
172c0 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
172d0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
172e0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
172f0 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
17300 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
17310 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
17320 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
17330 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
17340 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
17350 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
17360 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
17370 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
17380 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
17390 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
173a0 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
173b0 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
173c0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
173d0 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
173e0 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
173f0 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
17400 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
17410 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
17420 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17430 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
17440 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
17450 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
17460 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
17470 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17480 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17490 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
174a0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
174b0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
174c0 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e  ert( pBt->readOn
174d0 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ly==0 );.  asser
174e0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
174f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
17500 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
17510 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69  Savepoint );.  i
17520 66 28 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72  f( NEVER(p->inTr
17530 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
17540 20 7c 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c   || pBt->readOnl
17550 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  y) ){.    rc = S
17560 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a  QLITE_INTERNAL;.
17570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
17580 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
17590 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
175a0 52 49 54 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41  RITE );.    /* A
175b0 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
175c0 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
175d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
175e0 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
175f0 20 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67     ** an index g
17600 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
17610 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
17620 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
17630 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73  ing.    ** SQL s
17640 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73  tatements. It is
17650 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e   illegal to open
17660 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
17670 6c 62 61 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a  lback any.    **
17680 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
17690 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
176a0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
176b0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
176c0 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
176d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
176e0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
176f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
17700 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  atement);.  }.  
17710 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17720 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17730 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
17740 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
17750 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
17760 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
17770 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
17780 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
17790 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
177a0 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
177b0 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
177c0 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
177d0 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
177e0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
177f0 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
17800 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
17810 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
17820 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
17830 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
17840 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
17850 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
17860 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
17870 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
17880 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
17890 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
178a0 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
178b0 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
178c0 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
178d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
178e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
178f0 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
17900 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
17910 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
17920 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
17930 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
17940 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
17950 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
17960 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
17970 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
17980 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
17990 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
179a0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
179b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
179c0 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
179d0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
179e0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
179f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
17a00 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
17a10 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
17a20 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
17a30 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
17a40 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
17a50 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
17a60 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
17a70 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
17a80 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
17a90 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17aa0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17ab0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
17ac0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
17ad0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
17ae0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
17b00 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
17b10 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
17b20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17b30 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
17b40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
17b50 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
17b60 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
17b70 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
17b80 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
17b90 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66  ble.  The act of
17ba0 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72   acquiring a cur
17bb0 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20  sor gets a read 
17bc0 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
17bd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
17be0 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
17bf0 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
17c00 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
17c10 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
17c20 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
17c30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
17c40 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
17c50 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
17c60 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
17c70 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
17c80 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
17c90 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
17ca0 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
17cb0 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
17cc0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
17cd0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
17ce0 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
17cf0 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
17d00 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
17d10 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
17d20 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
17d30 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
17d40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
17d50 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
17d60 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
17d70 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
17d80 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
17d90 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
17da0 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
17db0 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
17dc0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
17dd0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
17de0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
17df0 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
17e00 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
17e10 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
17e20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
17e30 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
17e40 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
17e50 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
17e60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
17e70 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
17e80 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
17e90 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
17ea0 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
17eb0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
17ec0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
17ed0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
17ee0 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
17ef0 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
17f00 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
17f10 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
17f20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
17f30 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
17f40 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
17f50 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
17f60 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
17f70 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
17f80 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
17f90 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
17fa0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
17fb0 72 53 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66  rSize() bytes of
17fc0 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e   memory .** poin
17fd0 74 65 64 20 74 6f 20 62 79 20 70 43 75 72 20 68  ted to by pCur h
17fe0 61 76 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20  ave been zeroed 
17ff0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
18000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
18010 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
18020 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
18050 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18080 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
18090 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
180a0 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180c0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
180d0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
180e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
180f0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18110 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d  First arg to com
18120 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
18130 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
18140 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18160 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75  Space for new cu
18170 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rsor */.){.  int
18180 20 72 63 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67   rc;.  Pgno nPag
18190 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
181a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
181b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
181c0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
181d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
181e0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
181f0 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 77  ag==1 );.  if( w
18200 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 73 73  rFlag ){.    ass
18210 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
18220 6e 6c 79 20 29 3b 0a 20 20 20 20 69 66 28 20 4e  nly );.    if( N
18230 45 56 45 52 28 70 42 74 2d 3e 72 65 61 64 4f 6e  EVER(pBt->readOn
18240 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ly) ){.      ret
18250 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
18260 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  NLY;.    }.    r
18270 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64  c = checkForRead
18280 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
18290 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ble, 0, 0);.    
182a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
182b0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
182c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f  t( rc==SQLITE_LO
182d0 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
182e0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
182f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
18300 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
18310 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  1==0 ){.    rc =
18320 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
18330 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  try(p);.    if( 
18340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18350 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
18370 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
18380 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72  Pgno)iTable;.  r
18390 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
183a0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
183b0 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e  Pager, (int *)&n
183c0 50 61 67 65 29 3b 20 0a 20 20 69 66 28 20 72 63  Page); .  if( rc
183d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
183e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
183f0 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
18400 31 20 26 26 20 6e 50 61 67 65 3d 3d 30 20 29 7b  1 && nPage==0 ){
18410 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18420 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f  _EMPTY;.    goto
18430 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
18440 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  xception;.  }.  
18450 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
18460 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
18470 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
18480 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66  apPage[0]);.  if
18490 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
184a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  ){.    goto crea
184b0 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
184c0 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ion;.  }..  /* N
184d0 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
184e0 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
184f0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
18500 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
18510 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
18520 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  , link the curso
18530 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
18540 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74  red list and set
18550 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a   *ppCur (the.  *
18560 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e  * output argumen
18570 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
18580 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  on)..  */.  pCur
18590 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
185a0 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
185b0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
185c0 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
185d0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28  pCur->wrFlag = (
185e0 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75  u8)wrFlag;.  pCu
185f0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
18600 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
18610 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
18620 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
18630 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
18640 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
18650 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
18660 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
18670 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d  INVALID;.  pCur-
18680 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30  >cachedRowid = 0
18690 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
186a0 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63  TE_OK;..create_c
186b0 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a  ursor_exception:
186c0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
186d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b  Cur->apPage[0]);
186e0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
186f0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72  Unused(pBt);.  r
18700 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
18710 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
18720 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
18760 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
18770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18790 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
187a0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
187b0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
187e0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
187f0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
18800 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
18810 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
18820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
18830 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
18840 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
18850 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
18860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18870 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
18880 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
18890 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
188a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
188b0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
188c0 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
188d0 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
188e0 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
188f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18900 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18910 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
18920 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
18930 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
18940 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
18950 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
18960 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
18970 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
18980 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
18990 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
189a0 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
189b0 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
189c0 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
189d0 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
189e0 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
189f0 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
18a00 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
18a10 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
18a20 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
18a30 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
18a40 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
18a50 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
18a60 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  n sizeof(BtCurso
18a70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  r);.}../*.** Set
18a80 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69   the cached rowi
18a90 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  d value of every
18aa0 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73   cursor in the s
18ab0 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
18ac0 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64  e.** as pCur and
18ad0 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65   having the same
18ae0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
18af0 72 20 61 73 20 70 43 75 72 2e 20 20 54 68 65 20  r as pCur.  The 
18b00 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20  value is.** set 
18b10 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a  to iRowid..**.**
18b20 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72   Only positive r
18b30 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72 65 20  owid values are 
18b40 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64  considered valid
18b50 20 66 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e   for this cache.
18b60 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69 73  .** The cache is
18b70 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
18b80 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67  zero, indicating
18b90 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68   an invalid cach
18ba0 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69  e..** A btree wi
18bb0 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74  ll work fine wit
18bc0 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  h zero or negati
18bd0 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a  ve rowids.  We j
18be0 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61  ust cannot.** ca
18bf0 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61  che zero or nega
18c00 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69  tive rowids, whi
18c10 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20  ch means tables 
18c20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72  that use zero or
18c30 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77  .** negative row
18c40 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ids might run a 
18c50 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
18c60 42 75 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c  But in practice,
18c70 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61   zero.** or nega
18c80 74 69 76 65 20 72 6f 77 69 64 73 20 61 72 65 20  tive rowids are 
18c90 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f  very uncommon so
18ca0 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
18cb0 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a   be a problem..*
18cc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
18cd0 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 69  reeSetCachedRowi
18ce0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
18cf0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
18d00 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72  iRowid){.  BtCur
18d10 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
18d20 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73  pCur->pBt->pCurs
18d30 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
18d40 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  t){.    if( p->p
18d50 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70  gnoRoot==pCur->p
18d60 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63  gnoRoot ) p->cac
18d70 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  hedRowid = iRowi
18d80 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
18d90 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
18da0 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a  id==iRowid );.}.
18db0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18dc0 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 66  e cached rowid f
18dd0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
18de0 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65  sor.  A negative
18df0 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75   or zero.** retu
18e00 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
18e10 65 73 20 74 68 61 74 20 74 68 65 20 72 6f 77 69  es that the rowi
18e20 64 20 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c  d cache is inval
18e30 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
18e40 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66  .** ignored.  If
18e50 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
18e60 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72   has never befor
18e70 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e  e been set, then
18e80 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65   a.** zero is re
18e90 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74  turned..*/.sqlit
18ea0 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
18eb0 42 74 72 65 65 47 65 74 43 61 63 68 65 64 52 6f  BtreeGetCachedRo
18ec0 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
18ed0 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
18ee0 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b  ur->cachedRowid;
18ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
18f00 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
18f10 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
18f20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
18f30 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
18f40 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
18f50 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
18f60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18f70 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
18f80 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
18f90 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
18fa0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
18fb0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
18fc0 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
18fd0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
18fe0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
18ff0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
19000 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
19010 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
19020 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  r(pCur);.    if(
19030 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a   pCur->pPrev ){.
19040 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65        pCur->pPre
19050 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
19060 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
19070 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  e{.      pBt->pC
19080 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
19090 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
190a0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
190b0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e  {.      pCur->pN
190c0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
190d0 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a  r->pPrev;.    }.
190e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
190f0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
19100 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
19110 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
19120 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
19130 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
19140 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69  used(pBt);.    i
19150 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
19160 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20  wCache(pCur);.  
19170 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
19180 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
19190 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
191a0 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
191b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
191c0 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
191d0 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 4d  ITE_TEST./*.** M
191e0 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
191f0 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
19200 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
19210 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
19220 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
19230 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
19240 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
19250 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
19260 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
19270 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
19280 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19290 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43  BtCursor *pTempC
192a0 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
192b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
192c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
192d0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70  ;.  memcpy(pTemp
192e0 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f  Cur, pCur, sizeo
192f0 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20 20  f(BtCursor));.  
19300 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20  pTempCur->pNext 
19310 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  = 0;.  pTempCur-
19320 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66 6f  >pPrev = 0;.  fo
19330 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70 43  r(i=0; i<=pTempC
19340 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
19350 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
19360 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 61  rRef(pTempCur->a
19370 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67  pPage[i]->pDbPag
19380 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
19390 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65 79  ( pTempCur->pKey
193a0 3d 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ==0 );.}.#endif 
193b0 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
193c0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
193d0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  _TEST./*.** Dele
193e0 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  te a temporary c
193f0 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61  ursor such as wa
19400 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72  s made by the Cr
19410 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72  eateTemporaryCur
19420 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  sor().** functio
19430 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64  n above..*/.void
19440 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c   sqlite3BtreeRel
19450 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42  easeTempCursor(B
19460 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19470 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
19480 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
19490 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66  tex(pCur) );.  f
194a0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
194b0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
194c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
194d0 72 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ref(pCur->apPage
194e0 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  [i]->pDbPage);. 
194f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
19500 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d  e(pCur->pKey);.}
19510 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19520 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  E_TEST */../*.**
19530 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
19540 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
19550 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
19560 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
19570 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
19580 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
19590 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
195a0 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69  id, call.** sqli
195b0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
195c0 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
195d0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
195e0 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
195f0 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
19600 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
19610 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
19620 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
19630 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
19640 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   of calls to sql
19650 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
19660 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
19670 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
19680 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
19690 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
196a0 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
196b0 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
196c0 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
196d0 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
196e0 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
196f0 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
19700 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
19710 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
19720 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
19730 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
19740 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
19750 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
19760 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
19770 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
19780 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
19790 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
197a0 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
197b0 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
197c0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
197d0 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
197e0 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
197f0 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
19800 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
19810 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
19820 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
19830 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
19840 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
19850 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
19860 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
19870 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
19880 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
19890 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71  f(info));.    sq
198a0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
198b0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
198c0 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  [iPage], pCur->a
198d0 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e  iIdx[iPage], &in
198e0 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
198f0 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
19900 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
19910 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
19920 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
19930 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
19940 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66  fo(x).#endif.#if
19950 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f  def _MSC_VER.  /
19960 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e  * Use a real fun
19970 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f  ction in MSVC to
19980 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   work around bug
19990 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c  s in that compil
199a0 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  er. */.  static 
199b0 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
199c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
199d0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
199e0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
199f0 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65  .      int iPage
19a00 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
19a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19a20 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
19a30 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
19a40 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
19a50 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
19a60 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  .      pCur->val
19a70 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
19a80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
19a90 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
19aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
19ab0 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53  se /* if not _MS
19ac0 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73  C_VER */.  /* Us
19ad0 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c  e a macro in all
19ae0 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73   other compilers
19af0 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e   so that the fun
19b00 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64  ction is inlined
19b10 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43   */.#define getC
19b20 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20  ellInfo(pCur)   
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d     \.  if( pCur-
19b70 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
19b80 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bb0 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50      \.    int iP
19bc0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
19bd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c00 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74       \.    sqlit
19c10 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
19c20 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
19c30 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
19c40 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
19c50 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72  nfo); \.    pCur
19c60 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
19cb0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
19d00 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
19d10 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
19d50 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
19d60 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  R */../*.** Set 
19d70 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
19d80 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
19d90 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
19da0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
19db0 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
19dc0 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
19dd0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
19de0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
19df0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
19e00 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
19e10 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
19e20 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
19e30 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
19e40 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
19e50 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
19e60 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
19e70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19e80 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
19e90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19ea0 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
19eb0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
19ec0 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
19ed0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
19ee0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
19ef0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
19f00 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
19f10 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
19f20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19f30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
19f40 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19f50 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
19f60 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19f70 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
19f80 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
19f90 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
19fa0 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
19fb0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
19fc0 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
19fd0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
19fe0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
19ff0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a  nfo.nKey;.    }.
1a000 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
1a020 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
1a030 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1a040 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
1a050 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
1a060 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1a070 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  to.  Always retu
1a080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
1a090 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
1a0a0 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68  possible.  If th
1a0b0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
1a0c0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
1a0d0 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72  nting to an entr
1a0e0 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  y (which can hap
1a0f0 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
1a100 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  , if.** the data
1a110 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74  base is empty) t
1a120 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65  hen *pSize is se
1a130 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  t to 0..*/.int s
1a140 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
1a150 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1a160 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
1a170 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a180 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a190 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a1a0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1a1b0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1a1c0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1a1d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1a1e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1a1f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1a200 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
1a210 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1a220 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
1a230 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a240 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1a250 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69     /* Not pointi
1a260 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e  ng at a valid en
1a270 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65  try - set *pSize
1a280 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20   to 0. */.      
1a290 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
1a2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
1a2b0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1a2c0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
1a2d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b  Cur->info.nData;
1a2e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a2f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a300 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
1a310 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
1a320 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1a330 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
1a340 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
1a350 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
1a360 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
1a370 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1a380 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
1a390 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
1a3a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
1a3b0 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
1a3c0 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
1a3d0 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
1a3e0 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
1a3f0 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
1a400 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
1a410 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
1a420 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1a430 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
1a440 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1a450 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1a460 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ise:.**.** The p
1a470 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1a480 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
1a490 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
1a4a0 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77  ed list is .** w
1a4b0 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
1a4c0 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
1a4d0 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  fl is the last p
1a4e0 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65  age in its linke
1a4f0 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67  d .** list, *pPg
1a500 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
1a510 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
1a520 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
1a530 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72  ULL, and a refer
1a540 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50  ence to the MemP
1a550 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  age object corre
1a560 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
1a570 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c  age number pOvfl
1a580 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74   was obtained, t
1a590 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73  hen *ppPage is s
1a5a0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1a5b0 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  hat.** reference
1a5c0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
1a5d0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1a5e0 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c  e caller to call
1a5f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a   releasePage().*
1a600 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20  * on *ppPage to 
1a610 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e  free the referen
1a620 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65  ce. In no refere
1a630 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64  nce was obtained
1a640 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1a650 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73   pointer-map was
1a660 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
1a670 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70  the value for *p
1a680 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a  PgnoNext), then.
1a690 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ** *ppPage is se
1a6a0 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  t to zero..*/.st
1a6b0 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
1a6c0 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
1a6d0 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67  ared *pBt, .  Pg
1a6e0 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
1a6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76             /* Ov
1a700 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20  erflow page */. 
1a710 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
1a720 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
1a730 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
1a740 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
1a750 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
1a760 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
1a770 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
1a780 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1a790 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
1a7a0 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
1a7b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1a7c0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
1a7d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
1a7e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a7f0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1a800 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1a810 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
1a820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a830 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
1a840 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
1a850 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1a860 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
1a870 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
1a880 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
1a890 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
1a8a0 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
1a8b0 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
1a8c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
1a8d0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
1a8e0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
1a8f0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
1a900 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
1a910 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
1a920 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
1a930 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
1a940 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
1a950 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
1a960 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
1a970 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
1a980 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1a990 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
1a9a0 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
1a9b0 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
1a9c0 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
1a9d0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1a9e0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
1a9f0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
1aa00 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1aa10 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
1aa20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1aa30 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67  iGuess<=pagerPag
1aa40 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
1aa50 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
1aa60 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
1aa70 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
1aa80 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1aa90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
1aaa0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1aab0 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
1aac0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
1aad0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
1aae0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1aaf0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
1ab00 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1ab10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ab20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1ab30 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
1ab40 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
1ab50 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61  pPage, 0);.    a
1ab60 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
1ab70 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29  _OK || pPage==0)
1ab80 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d  ;.    if( next==
1ab90 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
1aba0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
1abb0 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
1abc0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
1abd0 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
1abe0 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
1abf0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
1ac00 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
1ac10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
1ac20 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1ac30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
1ac40 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
1ac50 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
1ac60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
1ac70 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1ac80 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
1ac90 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
1aca0 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
1acb0 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
1acc0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
1acd0 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
1ace0 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
1acf0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
1ad00 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
1ad10 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
1ad20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
1ad30 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
1ad40 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
1ad50 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
1ad60 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
1ad70 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
1ad80 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
1ad90 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
1ada0 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
1adb0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
1adc0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
1add0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
1ade0 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
1adf0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1ae00 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1ae10 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
1ae20 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1ae30 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
1ae40 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
1ae50 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
1ae60 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ae70 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
1ae80 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1ae90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1aea0 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
1aeb0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aed0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1aee0 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
1aef0 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
1af00 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
1af10 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
1af20 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
1af30 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
1af40 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
1af50 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
1af60 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
1af70 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
1af80 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
1af90 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
1afa0 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
1afb0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1afc0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1afd0 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
1afe0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1aff0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b000 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b010 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
1b020 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
1b030 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
1b040 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1b050 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
1b060 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
1b070 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1b080 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
1b090 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
1b0a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1b0b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b0c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1b0d0 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
1b0e0 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
1b0f0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
1b100 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
1b110 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
1b120 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1b130 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70  g to. If the eOp
1b140 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
1b150 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65   0, this is a re
1b160 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61  ad operation (da
1b170 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a  ta copied into.*
1b180 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20  * buffer pBuf). 
1b190 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  If it is non-zer
1b1a0 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61  o, a write (data
1b1b0 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20   copied from.** 
1b1c0 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a  buffer pBuf)..**
1b1d0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
1b1e0 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
1b1f0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
1b200 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
1b210 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
1b220 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
1b230 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1b240 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b250 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  tine does not ma
1b260 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e  ke a distinction
1b270 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64   between key and
1b280 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73   data..** It jus
1b290 74 20 72 65 61 64 73 20 6f 72 20 77 72 69 74 65  t reads or write
1b2a0 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  s bytes from the
1b2b0 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20   payload area.  
1b2c0 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61  Data might .** a
1b2d0 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69  ppear on the mai
1b2e0 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73 63 61  n page or be sca
1b2f0 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
1b300 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
1b310 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  .** pages..**.**
1b320 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
1b330 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  .isIncrblobHandl
1b340 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  e flag is set, a
1b350 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  nd the current.*
1b360 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  * cursor entry u
1b370 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
1b380 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1b390 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
1b3a0 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65   allocates space
1b3b0 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
1b3c0 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76  popluates the ov
1b3d0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1b3e0 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79   .** cache array
1b3f0 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
1b400 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e  flow). Subsequen
1b410 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
1b420 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  .** cache to mak
1b430 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
1b440 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
1b450 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
1b460 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
1b470 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1b480 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
1b490 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
1b4a0 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
1b4b0 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
1b4c0 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
1b4d0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
1b4e0 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
1b4f0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
1b500 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
1b510 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
1b520 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
1b530 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
1b540 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
1b550 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
1b560 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
1b570 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
1b580 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
1b590 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
1b5a0 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
1b5b0 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
1b5c0 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
1b5d0 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
1b5e0 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
1b5f0 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
1b600 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
1b610 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
1b620 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
1b630 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
1b640 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1b650 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
1b660 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
1b670 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
1b680 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
1b690 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
1b6a0 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
1b6b0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
1b6c0 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
1b6d0 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
1b6e0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
1b6f0 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
1b700 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
1b710 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
1b720 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20  skipKey,        
1b730 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e   /* offset begin
1b740 73 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  s at data if thi
1b750 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  s is true */.  i
1b760 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20  nt eOp          
1b770 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72      /* zero to r
1b780 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  ead. non-zero to
1b790 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20   write. */.){.  
1b7a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1b7b0 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72  Payload;.  int r
1b7c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b7d0 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   u32 nKey;.  int
1b7e0 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d   iIdx = 0;.  Mem
1b7f0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
1b800 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1b810 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65  >iPage]; /* Btre
1b820 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e  e page of curren
1b830 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53  t entry */.  BtS
1b840 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
1b850 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  r->pBt;         
1b860 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
1b870 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65  e this cursor be
1b880 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
1b890 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
1b8a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b8b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1b8c0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1b8d0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1b8e0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1b8f0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
1b900 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1b910 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
1b920 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1b930 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
1b940 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
1b950 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ll + pCur->info.
1b960 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20  nHeader;.  nKey 
1b970 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  = (pPage->intKey
1b980 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72   ? 0 : (int)pCur
1b990 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20  ->info.nKey);.. 
1b9a0 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
1b9b0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b      offset += nK
1b9c0 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66  ey;.  }.  if( of
1b9d0 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b  fset+amt > nKey+
1b9e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
1b9f0 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
1ba00 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1ba10 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
1ba20 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
1ba30 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
1ba40 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
1ba50 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
1ba60 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
1ba70 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
1ba80 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1ba90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1baa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1bab0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
1bac0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
1bad0 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
1bae0 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
1baf0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
1bb00 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1bb10 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
1bb20 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
1bb30 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
1bb40 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
1bb50 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
1bb60 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
1bb70 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
1bb80 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
1bb90 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
1bba0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
1bbb0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1bbc0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
1bbd0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
1bbe0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
1bbf0 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
1bc00 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1bc10 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  al;.  }..  if( r
1bc20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bc30 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
1bc40 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
1bc50 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1bc60 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
1bc70 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
1bc80 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
1bc90 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
1bca0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1bcb0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
1bcc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1bcd0 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
1bce0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1bcf0 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
1bd00 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
1bd10 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
1bd20 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
1bd30 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
1bd40 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
1bd50 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
1bd60 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
1bd70 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
1bd80 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
1bd90 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
1bda0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1bdb0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
1bdc0 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
1bdd0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
1bde0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
1bdf0 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
1be00 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
1be10 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
1be20 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
1be30 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
1be40 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
1be50 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
1be60 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
1be70 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
1be80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
1be90 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
1bea0 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
1beb0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1bec0 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
1bed0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
1bee0 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
1bef0 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
1bf00 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
1bf10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
1bf20 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
1bf30 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
1bf40 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
1bf50 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20        if( nOvfl 
1bf60 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
1bf70 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
1bf80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1bf90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bfa0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
1bfb0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1bfc0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
1bfd0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
1bfe0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
1bff0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
1c000 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
1c010 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
1c020 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
1c030 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
1c040 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1c050 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
1c060 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
1c070 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
1c080 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
1c090 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
1c0a0 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
1c0b0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
1c0c0 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
1c0d0 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
1c0e0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
1c0f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
1c100 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
1c110 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
1c120 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
1c130 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c140 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1c150 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
1c160 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
1c170 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1c180 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
1c190 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
1c1a0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1c1b0 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
1c1c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1c1d0 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
1c1e0 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
1c1f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
1c200 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1c210 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
1c220 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1c230 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
1c240 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
1c250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
1c260 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
1c270 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
1c280 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
1c290 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
1c2a0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
1c2b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1c2c0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
1c2d0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1c2e0 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
1c2f0 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
1c300 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
1c310 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
1c320 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
1c330 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
1c340 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
1c350 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
1c360 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
1c370 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
1c380 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
1c390 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1c3a0 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
1c3b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1c3c0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
1c3d0 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
1c3e0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
1c3f0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
1c400 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
1c410 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
1c420 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
1c430 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
1c440 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
1c450 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
1c460 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
1c470 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
1c480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c490 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
1c4a0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
1c4b0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
1c4c0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
1c4d0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
1c4e0 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
1c4f0 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
1c500 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
1c510 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
1c520 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65  /.        DbPage
1c530 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
1c540 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
1c550 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c560 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
1c570 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
1c580 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ge, &pDbPage);. 
1c590 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1c5a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c5b0 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
1c5c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1c5d0 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
1c5e0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
1c5f0 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
1c600 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
1c610 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
1c620 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
1c630 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f             a = o
1c640 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
1c650 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c660 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
1c670 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1c680 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
1c690 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
1c6a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1c6b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1c6c0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
1c6d0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
1c6e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20  ;.          amt 
1c6f0 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20  -= a;.          
1c700 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
1c710 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c720 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
1c730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
1c740 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
1c750 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1c760 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
1c770 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c780 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
1c790 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
1c7a0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
1c7b0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
1c7c0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
1c7d0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
1c7e0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
1c7f0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
1c800 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
1c810 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1c820 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1c830 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
1c840 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
1c850 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
1c860 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
1c870 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
1c880 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
1c890 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
1c8a0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
1c8b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c8c0 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
1c8d0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
1c8e0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
1c8f0 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
1c900 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1c910 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1c920 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1c930 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1c940 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1c950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c960 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1c970 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1c980 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
1c990 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
1c9a0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
1c9b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1c9c0 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  e] );.    if( pC
1c9d0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
1c9e0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
1c9f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1ca00 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1ca10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1ca20 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1ca30 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
1ca40 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1ca50 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
1ca60 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
1ca70 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
1ca80 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
1ca90 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b  ar*)pBuf, 0, 0);
1caa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1cab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1cac0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
1cad0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1cae0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
1caf0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
1cb00 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
1cb10 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
1cb20 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
1cb30 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
1cb40 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
1cb50 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1cb60 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
1cb70 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
1cb80 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
1cb90 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
1cba0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
1cbb0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
1cbc0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
1cbd0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
1cbe0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
1cbf0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
1cc00 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1cc10 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
1cc20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
1cc30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
1cc40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cc50 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28  _INCRBLOB.  if (
1cc60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1cc70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1cc80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1cc90 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
1cca0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1ccb0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1ccc0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1ccd0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1cce0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1ccf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cd00 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1cd10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1cd20 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1cd30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1cd40 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
1cd50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1cd60 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73  iPage] );.    as
1cd70 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1cd80 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1cd90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1cda0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
1cdb0 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
1cdc0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
1cdd0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
1cde0 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  f, 1, 0);.  }.  
1cdf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ce00 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1ce10 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
1ce20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1ce30 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1ce40 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
1ce50 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1ce60 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
1ce70 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
1ce80 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
1ce90 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30  ey if skipKey==0
1cea0 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74   and it points t
1ceb0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1cec0 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b  of data if.** sk
1ced0 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e  ipKey==1.  The n
1cee0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1cef0 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f  f available key/
1cf00 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a  data is written.
1cf10 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  ** into *pAmt.  
1cf20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
1cf30 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
1cf40 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
1cf50 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e  .** a valid poin
1cf60 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
1cf70 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
1cf80 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
1cf90 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
1cfa0 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
1cfb0 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
1cfc0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
1cfd0 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
1cfe0 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
1cff0 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
1d000 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
1d010 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
1d020 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
1d030 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
1d040 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
1d050 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
1d060 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
1d070 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
1d080 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1d090 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
1d0a0 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
1d0b0 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
1d0c0 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
1d0d0 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
1d0e0 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
1d0f0 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
1d100 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
1d110 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
1d120 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
1d130 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
1d140 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
1d150 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1d160 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
1d170 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
1d180 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
1d190 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
1d1a0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
1d1b0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
1d1c0 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50  ned char *fetchP
1d1d0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
1d1e0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
1d1f0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1d200 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
1d210 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
1d220 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20   *pAmt,         
1d230 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
1d240 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1d250 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
1d260 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20  .  int skipKey  
1d270 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20          /* read 
1d280 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74  beginning at dat
1d290 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
1d2a0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
1d2b0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
1d2c0 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d;.  MemPage *pP
1d2d0 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  age;.  u32 nKey;
1d2e0 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a  .  u32 nLocal;..
1d2f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
1d300 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  0 && pCur->iPage
1d310 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1d320 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1d330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d340 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1d350 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1d360 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1d370 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1d380 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
1d390 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1d3a0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  e];.  assert( pC
1d3b0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1d3c0 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
1d3d0 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ell );.  getCell
1d3e0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
1d3f0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
1d400 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
1d410 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
1d420 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
1d430 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1d440 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
1d450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1d460 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  Key = (int)pCur-
1d470 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
1d480 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
1d490 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
1d4a0 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
1d4b0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
1d4c0 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
1d4d0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
1d4e0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
1d4f0 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e  Local;.    if( n
1d500 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20  Local>nKey ){.  
1d510 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65      nLocal = nKe
1d520 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  y;.    }.  }.  *
1d530 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  pAmt = nLocal;. 
1d540 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64   return aPayload
1d550 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
1d560 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
1d570 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
1d580 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
1d590 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
1d5a0 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
1d5b0 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
1d5c0 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
1d5d0 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
1d5e0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
1d5f0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
1d600 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
1d610 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
1d620 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
1d630 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
1d640 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
1d650 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
1d660 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
1d670 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
1d680 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
1d690 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
1d6a0 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
1d6b0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
1d6c0 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
1d6d0 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
1d6e0 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
1d6f0 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
1d700 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
1d710 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
1d720 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
1d730 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
1d740 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
1d750 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
1d760 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1d770 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
1d780 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
1d790 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
1d7a0 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
1d7b0 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
1d7c0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1d7d0 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Amt){.  assert( 
1d7e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1d7f0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1d800 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1d810 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1d820 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1d830 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1d840 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1d850 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1d860 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1d870 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1d880 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
1d890 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f    return 0;.}.co
1d8a0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1d8b0 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
1d8c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d8d0 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
1d8e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1d8f0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1d900 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1d910 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
1d920 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1d930 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
1d940 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1d950 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
1d960 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
1d970 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
1d980 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29  d(pCur, pAmt, 1)
1d990 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1d9a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1d9b0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1d9c0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
1d9d0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
1d9e0 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
1d9f0 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
1da00 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
1da10 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
1da20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1da30 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
1da40 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
1da50 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
1da60 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
1da70 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
1da80 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
1da90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1daa0 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
1dab0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1dac0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1dad0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1dae0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1daf0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1db00 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
1db10 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
1db20 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1db30 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
1db40 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
1db50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1db60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1db70 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
1db80 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1db90 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
1dba0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1dbb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
1dbc0 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
1dbd0 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
1dbe0 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
1dbf0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
1dc00 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
1dc10 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1dc20 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1dc30 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
1dc40 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20  ge->nCell<1 ){. 
1dc50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1dc60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1dc70 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1dc80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1dc90 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  f NDEBUG./*.** P
1dca0 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
1dcb0 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
1dcc0 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
1dcd0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
1dce0 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
1dcf0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
1dd00 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
1dd10 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
1dd20 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
1dd30 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
1dd40 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
1dd50 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
1dd60 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
1dd70 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
1dd80 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
1dd90 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
1dda0 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
1ddb0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
1ddc0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
1ddd0 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
1dde0 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
1ddf0 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
1de00 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49  d){.  assert( iI
1de10 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
1de20 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
1de30 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
1de40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1de50 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
1de60 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
1de70 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
1de80 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
1de90 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1dea0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1deb0 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
1dec0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
1ded0 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
1dee0 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
1def0 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
1df00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
1df10 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
1df20 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
1df30 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
1df40 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1df50 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
1df60 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
1df70 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
1df80 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
1df90 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
1dfa0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
1dfb0 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
1dfc0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
1dfd0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
1dfe0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
1dff0 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
1e000 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
1e010 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1e020 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  eeMoveToParent(B
1e030 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1e040 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1e050 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1e060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1e070 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1e080 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1e090 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1e0a0 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
1e0b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1e0c0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1e0d0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1e0e0 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
1e0f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
1e100 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
1e110 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1e120 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
1e130 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e140 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
1e150 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1e160 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1e170 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
1e180 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
1e190 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1e1a0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1e1b0 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
1e1c0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1e1d0 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
1e1e0 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
1e1f0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
1e200 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
1e210 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
1e220 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e230 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  _OK;.  Btree *p 
1e240 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1e250 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1e260 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
1e270 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e280 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1e290 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1e2a0 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
1e2b0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1e2c0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1e2d0 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
1e2e0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1e2f0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1e300 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
1e310 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1e320 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1e330 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
1e340 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
1e350 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1e360 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
1e370 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1e380 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d  Cur->skip;.    }
1e390 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e3a0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
1e3b0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
1e3c0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
1e3d0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1e3e0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72  for(i=1; i<=pCur
1e3f0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1e400 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e410 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1e420 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1e430 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20  {.    if( .     
1e440 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
1e450 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
1e460 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
1e470 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
1e480 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a  age[0])).    ){.
1e490 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1e4a0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1e4b0 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
1e4c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1e4d0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
1e4e0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
1e4f0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1e500 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
1e510 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  t );.  pCur->iPa
1e520 67 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ge = 0;.  pCur->
1e530 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
1e540 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1e550 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
1e560 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
1e570 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1e580 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ..  if( pRoot->n
1e590 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
1e5a0 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
1e5b0 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
1e5c0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
1e5d0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
1e5e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e5f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
1e600 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  oot->pgno==1 );.
1e610 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
1e620 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
1e630 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
1e640 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
1e650 73 73 65 72 74 28 20 73 75 62 70 61 67 65 3e 30  ssert( subpage>0
1e660 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   );.    pCur->eS
1e670 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
1e680 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
1e690 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1e6a0 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
1e6b0 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
1e6c0 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e  ate = ((pRoot->n
1e6d0 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
1e6e0 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
1e6f0 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LID);.  }.  retu
1e700 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e710 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1e720 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
1e730 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
1e740 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
1e750 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
1e760 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1e770 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
1e780 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
1e790 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
1e7a0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
1e7b0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
1e7c0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
1e7d0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1e7e0 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
1e7f0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1e800 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
1e810 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e820 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
1e830 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
1e840 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1e850 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1e860 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1e870 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1e880 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
1e890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e8a0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
1e8b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e8c0 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
1e8d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e8e0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1e8f0 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
1e900 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
1e910 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1e920 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
1e930 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
1e940 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
1e950 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1e960 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
1e970 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1e980 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1e990 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
1e9a0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
1e9b0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
1e9c0 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
1e9d0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1e9e0 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
1e9f0 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
1ea00 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
1ea10 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
1ea20 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
1ea30 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
1ea40 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
1ea50 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
1ea60 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
1ea70 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
1ea80 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
1ea90 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
1eaa0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
1eab0 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
1eac0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
1ead0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
1eae0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
1eaf0 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
1eb00 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
1eb10 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
1eb20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1eb30 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1eb40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1eb50 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1eb60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1eb70 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
1eb80 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
1eb90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1eba0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ebb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1ebc0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ebd0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
1ebe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ebf0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
1ec00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ec10 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
1ec20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
1ec30 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1ec40 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1ec50 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
1ec60 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1ec70 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
1ec80 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
1ec90 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
1eca0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
1ecb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ecc0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
1ecd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
1ece0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
1ecf0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1ed00 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
1ed10 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1ed20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1ed30 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1ed40 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1ed50 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1ed60 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1ed70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1ed80 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
1ed90 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
1eda0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
1edb0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
1edc0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
1edd0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
1ede0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1edf0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1ee00 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
1ee10 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1ee20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1ee30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1ee40 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1ee50 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1ee60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1ee70 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1ee80 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1ee90 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
1eea0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
1eeb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1eec0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
1eed0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1eee0 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
1eef0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1ef00 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1ef10 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
1ef20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1ef30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ef40 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
1ef50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1ef60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1ef70 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
1ef80 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1ef90 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
1efa0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1efb0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
1efc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1efd0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1efe0 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
1eff0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1f000 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1f010 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1f020 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1f030 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1f040 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1f050 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1f060 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1f070 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1f080 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1f090 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
1f0a0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1f0b0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1f0c0 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
1f0d0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f0e0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f0f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f100 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1f110 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1f120 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
1f130 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
1f140 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
1f150 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
1f160 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
1f170 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
1f180 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1f190 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73  e && pCur->atLas
1f1a0 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  t ){.#ifdef SQLI
1f1b0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1f1c0 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
1f1d0 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
1f1e0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
1f1f0 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
1f200 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
1f210 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1f220 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
1f230 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
1f240 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
1f250 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
1f260 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1f270 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
1f280 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
1f290 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
1f2a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1f2b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1f2c0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
1f2d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1f2e0 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
1f2f0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1f300 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1f310 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
1f320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f330 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
1f340 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1f350 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1f360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1f370 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1f380 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1f390 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f3a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1f3b0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1f3c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
1f3d0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
1f3e0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1f3f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f400 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1f410 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1f420 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1f430 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1f440 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
1f450 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
1f460 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d  E_OK ?1:0;.    }
1f470 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f480 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1f490 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
1f4a0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
1f4b0 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
1f4c0 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
1f4d0 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
1f4e0 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
1f4f0 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
1f500 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
1f510 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
1f520 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1f530 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
1f540 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
1f550 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
1f560 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
1f570 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
1f580 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
1f590 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
1f5a0 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
1f5b0 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
1f5c0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
1f5d0 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
1f5e0 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
1f5f0 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
1f600 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
1f610 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
1f620 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
1f630 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
1f640 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
1f650 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
1f660 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
1f670 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
1f680 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
1f690 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
1f6a0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
1f6b0 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
1f6c0 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
1f6d0 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
1f6e0 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
1f6f0 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
1f700 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
1f710 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
1f720 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
1f730 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
1f740 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
1f750 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1f760 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1f770 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1f780 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
1f790 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
1f7a0 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
1f7b0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1f7c0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
1f7d0 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
1f7e0 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
1f7f0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
1f800 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
1f810 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
1f820 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1f830 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1f840 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1f850 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1f860 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
1f870 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
1f880 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
1f890 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
1f8a0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1f8b0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1f8c0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1f8d0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
1f8e0 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
1f8f0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
1f900 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f910 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
1f920 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1f930 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1f940 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
1f950 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
1f960 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
1f970 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
1f980 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
1f990 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
1f9a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
1f9b0 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
1f9c0 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
1f9d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1f9e0 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
1f9f0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
1fa00 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
1fa30 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
1fa40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1fa50 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1fa60 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1fa70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1fa80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1fa90 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1faa0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
1fab0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1fac0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
1fad0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
1fae0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
1faf0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
1fb00 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
1fb10 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
1fb20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
1fb30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1fb40 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
1fb50 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1fb60 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
1fb70 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
1fb80 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
1fb90 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
1fba0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
1fbb0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1fbc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fbd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1fbe0 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70  Cur->atLast && p
1fbf0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
1fc00 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
1fc10 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
1fc20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fc30 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1fc40 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1fc50 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
1fc60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1fc70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1fc80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fc90 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
1fca0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1fcb0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1fcc0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
1fcd0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1fce0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1fcf0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
1fd00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1fd10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1fd20 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
1fd30 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
1fd40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1fd50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1fd60 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
1fd70 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
1fd80 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
1fd90 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
1fda0 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
1fdb0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1fdc0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1fdd0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
1fde0 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a   int c = -1;  /*
1fdf0 20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20   pRes return if 
1fe00 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d  table is empty m
1fe10 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20  ust be -1 */.   
1fe20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
1fe30 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
1fe40 2d 31 3b 0a 20 20 20 20 69 66 28 20 28 21 70 50  -1;.    if( (!pP
1fe50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70  age->intKey && p
1fe60 49 64 78 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70  IdxKey==0) || up
1fe70 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  r<0 ){.      rc 
1fe80 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1fe90 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
1fea0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1feb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
1fec0 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
1fed0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1fee0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
1fef0 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  6)upr;.    }else
1ff00 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  {.      pCur->ai
1ff10 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1ff20 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77   = (u16)((upr+lw
1ff30 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
1ff40 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
1ff50 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
1ff60 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1ff70 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  e]; /* Index of 
1ff80 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
1ff90 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 75  pPage */.      u
1ffa0 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffc0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1ffd0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
1ffe0 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20   pPage */..     
1fff0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
20000 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65  e = 0;.      pCe
20010 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
20020 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
20030 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
20040 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
20050 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
20060 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
20070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
20080 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
20090 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75            u32 du
200a0 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mmy;.          p
200b0 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e  Cell += getVarin
200c0 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79  t32(pCell, dummy
200d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
200e0 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
200f0 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
20100 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
20110 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  if( nCellKey==in
20120 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
20130 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
20140 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
20150 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
20160 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a          c = -1;.
20170 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20180 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
20190 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
201a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
201b0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
201c0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61          pCur->va
201d0 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
201e0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
201f0 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
20200 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20210 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
20220 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
20230 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37 36  age-size is 3276
20240 38 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  8 bytes. This me
20250 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
20260 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
20270 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
20280 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
20290 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
202a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
202b0 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39 38   is at most 8198
202c0 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d 61   bytes, which ma
202d0 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
202e0 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
202f0 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
20300 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
20310 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
20320 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
20330 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
20340 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
20350 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
20360 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
20370 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
20380 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
20390 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
203a0 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
203b0 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
203c0 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
203d0 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
203e0 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
203f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
20400 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
20410 20 20 20 20 20 20 20 69 66 28 20 21 28 6e 43 65         if( !(nCe
20420 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e 43  ll & 0x80) && nC
20430 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ell<=pPage->maxL
20440 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
20450 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
20460 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
20470 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
20480 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
20490 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
204a0 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
204b0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
204c0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
204d0 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
204e0 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
204f0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
20500 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
20510 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
20520 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
20530 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
20540 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
20550 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
20560 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
20570 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
20580 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
20590 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
205a0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
205b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
205c0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
205d0 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
205e0 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
205f0 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
20600 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
20610 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
20620 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
20630 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
20640 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
20650 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
20660 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
20670 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
20680 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20690 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
206a0 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
206b0 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
206c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
206d0 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
206e0 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
206f0 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
20700 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
20710 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
20720 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
20730 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
20740 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
20750 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
20760 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
20770 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
20780 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
20790 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
207a0 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lled. */.       
207b0 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
207c0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
207d0 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
207e0 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
207f0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
20800 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20810 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
20820 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
20830 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
20840 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
20850 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
20860 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
20870 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
20880 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
20890 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
208a0 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
208b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
208c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
208d0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
208e0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
208f0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
20900 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20910 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
20920 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
20930 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
20940 65 6c 6c 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  ellKey, 0, 0);. 
20950 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
20960 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20970 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
20980 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
20990 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
209a0 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
209b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
209c0 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
209d0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
209e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
209f0 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
20a00 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
20a10 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
20a20 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
20a30 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
20a40 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
20a50 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  lwr - 1;.       
20a60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20a80 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
20a90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
20aa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
20ab0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
20ac0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
20ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20ae0 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
20af0 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
20b00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b10 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
20b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20b30 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
20b40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20b50 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
20b60 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
20b70 65 5d 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b  e] = (u16)((lwr+
20b80 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  upr)/2);.    }. 
20b90 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
20ba0 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
20bb0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
20bc0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
20bd0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
20be0 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
20bf0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
20c00 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
20c10 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
20c20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
20c30 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
20c40 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
20c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
20c60 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
20c70 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
20c80 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
20c90 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
20ca0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20cb0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
20cc0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
20cd0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20ce0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
20cf0 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
20d00 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
20d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20d20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
20d30 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
20d40 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
20d50 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
20d60 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75  u16)lwr;.    pCu
20d70 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
20d80 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
20d90 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  idNKey = 0;.    
20da0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
20db0 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
20dc0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
20dd0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
20de0 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
20df0 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  sh:.  return rc;
20e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
20e10 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
20e20 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
20e30 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
20e40 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
20e50 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
20e60 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
20e70 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
20e80 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
20e90 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
20ea0 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
20eb0 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
20ec0 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   work..*/.int sq
20ed0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
20ee0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
20ef0 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
20f00 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
20f10 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
20f20 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
20f30 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
20f40 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
20f50 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
20f60 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
20f70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
20f80 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
20f90 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
20fa0 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
20fb0 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
20fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
20fd0 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
20fe0 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
20ff0 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
21000 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
21010 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
21020 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21040 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
21050 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
21060 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
21070 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
21080 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72  ex key */.  char
21090 20 61 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20   aSpace[150];   
210a0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
210b0 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
210c0 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
210d0 6c 6c 6f 63 20 2a 2f 0a 0a 0a 20 20 69 66 28 20  lloc */...  if( 
210e0 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
210f0 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28  rt( nKey==(i64)(
21100 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20  int)nKey );.    
21110 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  pIdxKey = sqlite
21120 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
21130 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
21140 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
21150 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 20 20 20 20 20 20 20 20 61 53 70 61 63 65 2c           aSpace,
21180 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29   sizeof(aSpace))
21190 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
211a0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
211b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
211c0 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
211d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
211e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
211f0 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
21200 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
21210 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20   bias, pRes);.  
21220 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
21230 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
21240 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
21250 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20  pIdxKey);.  }.  
21260 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
21270 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
21280 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
21290 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
212a0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
212b0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
212c0 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
212d0 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
212e0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
212f0 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
21300 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
21310 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
21320 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
21330 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
21340 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
21350 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
21360 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
21370 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
21380 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
21390 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
213a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
213b0 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
213c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
213d0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
213e0 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
213f0 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
21400 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
21410 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
21420 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
21430 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
21440 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
21450 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
21460 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
21470 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
21480 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
21490 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
214a0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
214b0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
214c0 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
214d0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
214e0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
214f0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
21500 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
21510 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
21520 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
21530 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
21540 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
21550 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
21560 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
21570 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
21580 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21590 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
215a0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
215b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
215c0 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
215d0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
215e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
215f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21600 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
21610 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
21620 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
21630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
21640 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
21650 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
21660 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
21670 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
21680 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
21690 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
216a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
216b0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
216c0 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
216d0 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
216e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
216f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21700 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
21710 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
21720 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21730 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
21740 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
21750 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
21760 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
21770 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
21780 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e  rt( idx<=pPage->
21790 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72  nCell );..  pCur
217a0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
217b0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
217c0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  Key = 0;.  if( i
217d0 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
217e0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
217f0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
21800 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
21810 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
21820 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
21830 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
21840 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
21850 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
21860 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
21870 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
21880 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
21890 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
218a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rc;.    }.    do
218b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
218c0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
218d0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
218e0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
218f0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
21900 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
21910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21930 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
21940 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
21950 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
21960 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21970 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
21980 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
21990 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
219a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
219b0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
219c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
219d0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
219e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
219f0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
21a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21a10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21a20 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
21a30 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
21a40 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
21a50 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
21a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21a70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
21a80 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
21a90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
21aa0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  }.../*.** Step t
21ab0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
21ac0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
21ad0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
21ae0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
21af0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
21b00 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
21b10 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
21b20 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
21b30 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
21b40 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
21b50 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
21b60 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
21b70 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
21b80 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
21b90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21ba0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
21bb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
21bc0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
21bd0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
21be0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
21bf0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21c00 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
21c10 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
21c20 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
21c30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21c40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
21c50 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
21c60 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  tLast = 0;.  if(
21c70 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
21c80 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
21c90 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
21ca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21cb0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
21cc0 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a  pCur->skip<0 ){.
21cd0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
21ce0 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
21cf0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
21d00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
21d10 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a  Cur->skip = 0;..
21d20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
21d30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21d40 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
21d50 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
21d60 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
21d70 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
21d80 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
21d90 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
21da0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
21db0 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
21dc0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
21dd0 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
21de0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
21df0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
21e00 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
21e10 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
21e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
21e30 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
21e40 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29  Cur->iPage]==0 )
21e50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
21e60 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
21e70 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
21e80 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
21e90 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
21ea0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
21eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21ec0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21ed0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
21ee0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
21ef0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
21f00 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
21f10 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
21f20 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43  Key = 0;..    pC
21f30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21f40 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
21f50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
21f60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
21f70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
21f80 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
21f90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
21fa0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
21fb0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
21fc0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
21fd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21fe0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
21ff0 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
22000 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22010 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
22020 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
22030 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22040 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
22050 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
22060 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
22070 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
22080 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
22090 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
220a0 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
220b0 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
220c0 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
220d0 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
220e0 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
220f0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
22100 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
22110 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
22120 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
22130 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
22140 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
22150 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
22160 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
22170 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
22180 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
22190 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
221a0 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
221b0 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
221c0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
221d0 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
221e0 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
221f0 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
22200 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
22210 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
22220 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
22230 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
22240 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
22250 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65  ot 0, then a (fe
22260 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20  eble) effort is 
22270 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
22280 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
22290 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
222a0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
222b0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
222c0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
222d0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
222e0 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
222f0 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
22300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
22310 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
22320 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
22330 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
22340 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
22350 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72  exact" parameter
22360 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74   is not 0, and t
22370 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e  he page-number n
22380 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a  earby exists .**
22390 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
223a0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
223b0 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65   it is guarentee
223c0 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
223d0 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c  . This.** is onl
223e0 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  y used by auto-v
223f0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20  acuum databases 
22400 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
22410 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a  a new table..*/.
22420 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
22430 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
22440 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
22450 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
22460 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ge, .  Pgno *pPg
22470 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72  no, .  Pgno near
22480 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29  by,.  u8 exact.)
22490 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
224a0 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
224b0 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
224c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
224d0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
224e0 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
224f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
22500 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
22510 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
22520 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
22530 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
22540 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
22550 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
22560 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
22570 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
22580 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
22590 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
225a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
225b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
225c0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
225d0 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 70 61  1;.  mxPage = pa
225e0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
225f0 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
22600 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
22610 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 6d  [36]);.  if( n>m
22620 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
22630 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
22640 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
22650 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
22660 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
22670 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
22680 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
22690 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
226a0 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
226b0 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
226c0 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
226d0 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
226e0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
226f0 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
22700 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
22710 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65  'exact' paramete
22720 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61  r was true and a
22730 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
22740 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
22750 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
22760 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
22770 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
22780 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
22790 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
227a0 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
227b0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
227c0 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
227d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
227e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
227f0 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20     if( exact && 
22800 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
22810 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  {.      u8 eType
22820 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22830 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
22840 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
22850 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
22860 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
22870 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
22880 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
22890 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
228a0 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65   rc;.      if( e
228b0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
228c0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
228d0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
228e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
228f0 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a  pPgno = nearby;.
22900 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
22910 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
22920 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
22930 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
22940 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
22950 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
22960 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
22970 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
22980 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
22990 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
229a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
229b0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
229c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
229d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
229e0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
229f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
22a00 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
22a10 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
22a20 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
22a30 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
22a40 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
22a50 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
22a60 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
22a70 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
22a80 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
22a90 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
22aa0 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
22ab0 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
22ac0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
22ad0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
22ae0 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
22af0 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
22b00 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
22b10 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
22b20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
22b30 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
22b40 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
22b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
22b60 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
22b70 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
22b80 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
22b90 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
22ba0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
22bb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
22bc0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
22bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22be0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
22bf0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
22c00 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
22c10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22c20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
22c30 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
22c40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
22c50 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
22c60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
22c70 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
22c80 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
22c90 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
22ca0 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
22cb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
22cc0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
22cd0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
22ce0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
22cf0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
22d00 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
22d10 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
22d20 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
22d30 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
22d40 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
22d50 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
22d60 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
22d70 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
22d80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22d90 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
22da0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
22db0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
22dc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
22dd0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
22de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22df0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
22e00 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
22e10 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
22e20 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
22e30 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
22e40 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
22e50 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
22e60 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
22e70 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
22e80 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
22e90 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
22ea0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
22eb0 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
22ec0 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
22ed0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
22ee0 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
22ef0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
22f00 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
22f10 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
22f20 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
22f30 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
22f40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
22f50 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
22f60 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
22f70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
22f80 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
22f90 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
22fa0 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54  st && nearby==iT
22fb0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
22fc0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
22fd0 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
22fe0 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
22ff0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
23000 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
23010 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
23020 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
23030 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
23040 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
23050 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54  sert( *pPgno==iT
23060 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  runk );.        
23070 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
23080 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
23090 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
230a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
230b0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
230c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
230d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
230e0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
230f0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
23100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23110 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
23120 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
23130 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
23140 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
23150 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
23160 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
23170 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
23180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23190 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
231a0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
231b0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
231c0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
231d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
231e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
231f0 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
23200 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
23210 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
23220 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
23230 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
23240 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
23250 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
23260 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
23270 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
23280 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
23290 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
232a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
232b0 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
232c0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
232d0 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
232e0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
232f0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
23300 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
23310 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
23320 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23330 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
23350 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
23360 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
23370 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
23380 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
23390 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
233a0 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
233b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
233c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
233d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
233e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
233f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
23400 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
23410 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
23420 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
23430 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
23440 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23460 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
23470 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
23480 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
23490 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
234a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
234b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
234c0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
234d0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
234e0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
234f0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
23500 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
23510 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
23520 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
23530 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
23540 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
23550 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
23560 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
23570 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
23580 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
23590 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
235a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
235b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
235c0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
235d0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
235e0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
235f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
23600 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
23610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
23620 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
23630 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23640 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
23650 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
23660 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
23670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23680 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
23690 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
236a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
236b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
236c0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
236d0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
236e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
236f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
23700 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
23710 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
23720 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
23730 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
23740 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
23750 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
23760 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
23770 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
23780 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
23790 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
237a0 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
237b0 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
237c0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
237d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
237e0 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
237f0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ata;.        rc 
23800 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
23810 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
23820 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
23830 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
23840 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
23850 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
23860 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
23870 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
23880 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20        u32 i;.   
23890 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b         int dist;
238a0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
238b0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
238c0 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74    dist = get4byt
238d0 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
238e0 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
238f0 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69   if( dist<0 ) di
23900 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20  st = -dist;.    
23910 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
23920 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
23930 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67        int d2 = g
23940 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
23950 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b  +i*4]) - nearby;
23960 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23970 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32   d2<0 ) d2 = -d2
23980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23990 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
239a0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
239b0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
239c0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
239d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
239e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
239f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23a00 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
23a10 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
23a20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
23a30 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
23a40 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
23a50 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
23a60 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
23a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
23a80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
23a90 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
23aa0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
23ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23ac0 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
23ad0 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
23ae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
23af0 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
23b00 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
23b10 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
23b20 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
23b30 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61        nPage = pa
23b40 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
23b50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23b60 20 69 50 61 67 65 3e 6e 50 61 67 65 20 29 7b 0a   iPage>nPage ){.
23b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23b80 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65  ree page off the
23b90 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
23ba0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
23bb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
23bc0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
23bd0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
23be0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
23bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23c00 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
23c10 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
23c20 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
23c30 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
23c40 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
23c50 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
23c60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23c70 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
23c80 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
23c90 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
23ca0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
23cb0 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
23cc0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
23cd0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
23ce0 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
23cf0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
23d00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
23d10 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
23d20 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
23d30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23d40 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
23d50 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
23d60 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) );.          n
23d70 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
23d80 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
23d90 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20  Bt, *pPgno);.   
23da0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23db0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
23dc0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
23dd0 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
23de0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
23df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23e00 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23e20 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
23e30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
23e40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23e60 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
23e70 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
23e80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23ea0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
23eb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23ec0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
23ed0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
23ee0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
23ef0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
23f00 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
23f10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
23f20 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
23f30 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
23f40 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20  list, so create 
23f50 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68  a new page at th
23f60 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20  e.    ** end of 
23f70 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
23f80 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65  int nPage = page
23f90 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
23fa0 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50  .    *pPgno = nP
23fb0 61 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66  age + 1;..    if
23fc0 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
23fd0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
23fe0 20 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e   ){.      (*pPgn
23ff0 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  o)++;.    }..#if
24000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24010 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
24020 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
24030 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
24040 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f  PAGE(pBt, *pPgno
24050 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
24060 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
24070 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
24080 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
24090 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
240a0 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
240b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
240c0 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
240d0 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
240e0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
240f0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
24100 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
24110 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
24120 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
24130 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
24140 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
24150 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
24160 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
24170 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
24180 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
24190 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
241a0 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
241b0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
241c0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
241d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
241e0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
241f0 74 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c  t, *pPgno, &pPg,
24200 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
24210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24220 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24230 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24240 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
24250 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
24260 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
24270 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
24280 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
24290 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
242a0 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
242b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
242c0 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29  pBt) ){ (*pPgno)
242d0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
242e0 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
242f0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
24300 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
24310 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
24320 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
24330 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
24340 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
24350 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
24360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24370 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
24380 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
24390 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
243a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
243b0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
243c0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
243d0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
243e0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
243f0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
24400 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
24410 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
24420 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
24430 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
24440 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
24450 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
24460 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
24470 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
24480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24490 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
244a0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
244b0 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
244c0 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
244d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
244e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
244f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
24500 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
24510 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
24520 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
24530 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
24540 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
24550 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
24560 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
24570 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
24580 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
24590 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
245a0 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
245b0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
245c0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
245d0 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
245e0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
245f0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
24600 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
24610 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
24620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24630 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
24640 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
24650 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
24660 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
24670 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
24680 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
24690 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
246a0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
246b0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
246c0 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
246d0 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
246e0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
246f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
24700 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
24710 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
24720 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
24730 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
24740 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
24750 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
24760 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
24770 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
24780 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
24790 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
247a0 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
247b0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
247c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
247d0 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
247e0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
247f0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
24800 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
24810 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
24820 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
24830 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
24840 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24850 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
24860 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
24870 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
24880 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
24890 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248b0 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
248c0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
248d0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
24900 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
24910 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
24940 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
24950 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
24960 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24970 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
24980 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
24990 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  ( iPage>1 );.  a
249a0 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
249b0 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
249c0 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
249d0 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
249e0 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
249f0 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
24a00 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
24a10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
24a20 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
24a30 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
24a40 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
24a50 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
24a60 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
24a70 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
24a80 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
24a90 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
24aa0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
24ab0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
24ac0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
24ad0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
24ae0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
24af0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
24b00 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
24b10 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66  , nFree+1);..#if
24b20 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
24b30 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
24b40 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
24b50 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
24b60 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
24b70 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
24b80 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
24b90 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
24ba0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
24bb0 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
24bc0 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
24bd0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
24be0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
24bf0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
24c00 29 29 29 0a 20 20 20 7c 7c 20 20 20 20 20 20 20  ))).   ||       
24c10 20 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74       (rc = sqlit
24c20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
24c30 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20  ge->pDbPage)).  
24c40 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
24c50 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
24c60 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
24c70 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
24c80 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
24c90 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
24ca0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
24cb0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
24cc0 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
24cd0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
24ce0 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
24cf0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
24d00 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
24d10 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
24d20 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
24d30 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
24d40 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
24d50 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  EPAGE, 0);.    i
24d60 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
24d70 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
24d80 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
24d90 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
24da0 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
24db0 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
24dc0 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
24dd0 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
24de0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
24df0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
24e00 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
24e10 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
24e20 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
24e30 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
24e40 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
24e50 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
24e60 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
24e70 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
24e80 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
24e90 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
24ea0 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
24eb0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
24ec0 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
24ed0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
24ee0 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
24ef0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
24f00 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
24f10 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
24f20 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
24f30 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ree!=0 ){.    in
24f40 74 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  t nLeaf;        
24f50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
24f60 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
24f70 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
24f80 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
24f90 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
24fa0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
24fb0 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  2]);.    rc = sq
24fc0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
24fd0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
24fe0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
24ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25000 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
25010 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
25020 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
25030 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
25040 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
25050 20 20 69 66 28 20 6e 4c 65 61 66 3c 30 20 29 7b    if( nLeaf<0 ){
25060 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
25070 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25080 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
25090 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
250a0 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42      if( nLeaf<pB
250b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
250c0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
250d0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
250e0 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
250f0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
25100 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
25110 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
25120 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
25130 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
25140 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
25150 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
25160 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
25170 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
25180 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
25190 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
251a0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
251b0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
251c0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
251d0 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
251e0 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
251f0 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
25200 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
25210 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
25220 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
25230 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
25240 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
25250 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
25260 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
25270 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
25280 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
25290 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
252a0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
252b0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
252c0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
252d0 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
252e0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
252f0 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
25300 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20  will contain to 
25310 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
25320 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
25330 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
25340 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
25350 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
25360 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
25370 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
25380 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
25390 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
253a0 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
253b0 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
253c0 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
253d0 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
253e0 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
253f0 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
25400 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
25410 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
25420 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
25430 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
25440 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
25450 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
25460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25470 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
25480 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
25490 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
254a0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
254b0 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
254c0 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69  f*4], iPage);.#i
254d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  fndef SQLITE_SEC
254e0 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  URE_DELETE.     
254f0 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
25500 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25510 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
25520 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
25530 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
25540 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  f.        rc = b
25550 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
25560 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
25570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
25580 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
25590 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
255a0 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
255b0 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
255c0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
255d0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
255e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
255f0 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
25600 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
25610 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
25620 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
25630 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
25640 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
25650 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
25660 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
25670 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
25680 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
25690 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
256a0 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
256b0 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
256c0 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
256d0 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
256e0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
256f0 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
25700 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
25710 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
25720 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
25730 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
25740 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
25750 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 20 20 28  ..  */.  if(   (
25760 28 21 70 50 61 67 65 29 20 26 26 20 28 30 20 21  (!pPage) && (0 !
25770 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  = (rc = sqlite3B
25780 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
25790 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
257a0 30 29 29 29 29 0a 20 20 20 20 20 7c 7c 20 28 30  0)))).     || (0
257b0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
257c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
257d0 65 2d 3e 70 44 62 50 61 67 65 29 29 29 0a 20 20  e->pDbPage))).  
257e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
257f0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
25800 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
25810 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
25820 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
25830 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
25840 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
25850 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
25860 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
25870 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
25880 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
25890 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
258a0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
258b0 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
258c0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
258d0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
258e0 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
258f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
25900 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
25910 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
25920 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
25930 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28  ic int freePage(
25940 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
25950 0a 20 20 72 65 74 75 72 6e 20 66 72 65 65 50 61  .  return freePa
25960 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
25970 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
25980 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  no);.}../*.** Fr
25990 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
259a0 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
259b0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
259c0 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
259d0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
259e0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
259f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
25a00 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
25a10 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
25a20 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
25a30 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
25a40 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
25a50 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31   int nOvfl;.  u1
25a60 36 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  6 ovflPageSize;.
25a70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25a80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
25a90 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
25aa0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
25ab0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
25ac0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
25ad0 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
25ae0 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
25af0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25b00 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
25b10 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
25b20 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
25b30 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
25b40 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
25b50 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
25b60 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
25b70 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
25b80 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
25b90 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
25ba0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
25bb0 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
25bc0 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
25bd0 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
25be0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
25bf0 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
25c00 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50  .  assert( ovflP
25c10 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e  gno==0 || nOvfl>
25c20 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  0 );.  while( nO
25c30 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
25c40 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
25c50 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
25c60 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
25c70 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
25c80 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
25c90 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
25ca0 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
25cb0 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
25cc0 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
25cd0 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
25ce0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
25cf0 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
25d00 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
25d10 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
25d20 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
25d30 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
25d40 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
25d50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25d60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25d70 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
25d80 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
25d90 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
25da0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
25db0 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
25dc0 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
25dd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
25de0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72     }.    rc = fr
25df0 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
25e00 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
25e10 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
25e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
25e30 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
25e40 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
25e50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
25e60 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
25e70 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
25e80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25e90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
25ea0 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
25eb0 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
25ec0 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
25ed0 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
25ee0 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
25ef0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
25f00 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
25f10 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
25f20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
25f30 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
25f40 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
25f50 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
25f60 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
25f70 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
25f80 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
25f90 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
25fa0 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
25fb0 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
25fc0 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
25fd0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
25fe0 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
25ff0 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
26000 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
26010 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
26020 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
26030 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
26040 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
26050 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
26060 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
26070 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
26080 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
26090 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
260a0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
260b0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
260c0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
260d0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
260e0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
260f0 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
26100 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
26110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
26120 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
26130 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
26140 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
26150 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
26160 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
26170 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
26180 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
26190 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
261a0 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
261b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
261c0 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
261d0 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
261e0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
261f0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
26200 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
26210 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
26220 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
26230 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
26240 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
26250 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
26260 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
26270 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
26280 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
26290 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
262a0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
262b0 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
262c0 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
262d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
262e0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
262f0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
26300 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
26310 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
26320 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
26330 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
26340 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
26350 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
26360 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
26370 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
26380 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
26390 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
263a0 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
263b0 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
263c0 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
263d0 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
263e0 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
263f0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
26400 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
26410 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
26420 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
26430 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
26440 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
26450 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
26460 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
26470 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
26480 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
26490 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
264a0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
264b0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
264c0 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
264d0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
264e0 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
264f0 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72  der], nData+nZer
26500 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
26510 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d   nData = nZero =
26520 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   0;.  }.  nHeade
26530 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
26540 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
26550 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
26560 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
26570 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
26580 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
26590 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
265a0 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
265b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
265c0 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
265d0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
265e0 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74  Data==(u32)(nDat
265f0 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20  a+nZero) );.  . 
26600 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
26610 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
26620 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
26630 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
26640 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
26650 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
26660 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
26670 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
26680 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
26690 66 28 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66  f( nKey>0x7fffff
266a0 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b  ff || pKey==0 ){
266b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
266c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
266d0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
266e0 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20   += (int)nKey;. 
266f0 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
26700 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
26710 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
26720 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
26730 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
26740 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
26750 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
26760 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
26770 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
26780 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
26790 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
267a0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
267b0 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
267c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
267d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
267e0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
267f0 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
26800 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
26810 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
26820 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
26830 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
26840 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
26850 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
26860 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
26870 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
26880 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
26890 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
268a0 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
268b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
268c0 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
268d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
268e0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
268f0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
26900 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
26910 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
26920 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
26930 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
26940 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
26950 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
26960 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
26970 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
26980 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
26990 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
269a0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
269b0 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
269c0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
269d0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
269e0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
269f0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
26a00 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
26a10 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
26a20 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
26a30 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
26a40 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
26a50 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
26a60 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
26a70 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
26a80 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
26a90 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
26aa0 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
26ab0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
26ac0 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
26ad0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
26ae0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
26af0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
26b00 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
26b10 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
26b20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
26b30 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
26b40 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
26b50 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
26b60 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
26b70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26b80 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
26b90 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
26ba0 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
26bb0 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
26bc0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
26bd0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
26be0 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
26bf0 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  trmap);.        
26c00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26c10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
26c20 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
26c30 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
26c40 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
26c50 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
26c60 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
26c70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26c80 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
26c90 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
26ca0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
26cb0 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
26cc0 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
26cd0 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
26ce0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
26cf0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
26d00 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
26d10 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
26d20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
26d30 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
26d40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
26d50 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
26d60 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
26d70 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
26d80 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
26d90 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
26da0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
26db0 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
26dc0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
26dd0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
26de0 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
26df0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
26e00 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
26e10 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
26e20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
26e30 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
26e40 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
26e50 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
26e60 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
26e70 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
26e80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
26e90 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
26ea0 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
26eb0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
26ec0 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
26ed0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
26ee0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
26ef0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
26f00 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
26f10 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
26f20 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
26f30 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
26f40 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
26f50 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
26f60 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
26f70 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
26f80 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
26f90 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
26fa0 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
26fb0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
26fc0 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
26fd0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
26fe0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
26ff0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
27000 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
27010 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
27020 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
27030 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
27040 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
27050 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
27060 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
27070 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
27080 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
27090 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
270a0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
270b0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
270c0 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
270d0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
270e0 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
270f0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
27100 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
27110 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
27120 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
27130 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
27140 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
27150 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
27160 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
27170 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
27180 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
27190 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
271a0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
271b0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
271c0 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
271d0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
271e0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
271f0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
27200 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
27210 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
27220 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
27230 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
27240 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
27250 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
27260 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
27270 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
27280 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
27290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
272a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
272b0 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
272c0 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
272d0 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
272e0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
272f0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
27300 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
27310 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
27320 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
27330 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
27340 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
27350 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
27360 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
27370 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
27380 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
27390 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
273a0 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
273b0 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
273c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
273d0 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
273e0 73 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43  static int dropC
273f0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
27400 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
27410 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20   sz){.  int i;  
27420 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
27430 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
27440 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
27450 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
27460 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
27470 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
27480 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
27490 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
274a0 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
274b0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
274c0 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
274d0 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
274e0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
274f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
27500 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
27510 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
27520 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
27530 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
27540 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
27550 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
27560 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
27570 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
27580 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
27590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
275a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
275b0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
275c0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
275d0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
275e0 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
275f0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
27600 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
27610 62 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28  byte(ptr);.  if(
27620 20 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f   (pc<pPage->hdrO
27630 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
27640 6c 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20  leaf?0:4)).     
27650 7c 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d  || (pc+sz>pPage-
27660 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
27670 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
27680 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
27690 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
276a0 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
276b0 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
276c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
276d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
276e0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b    }.  for(i=idx+
276f0 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
27700 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
27710 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
27720 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
27730 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
27740 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
27750 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
27760 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
27770 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
27780 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
27790 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74  Free += 2;.  ret
277a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
277b0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
277c0 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
277d0 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
277e0 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
277f0 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
27800 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
27810 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
27820 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
27830 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
27840 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
27850 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
27860 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
27870 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
27880 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
27890 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
278a0 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
278b0 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
278c0 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
278d0 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
278e0 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
278f0 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
27900 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
27910 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
27920 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
27930 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
27940 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
27950 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
27960 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
27970 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
27980 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
27990 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
279a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
279b0 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
279c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
279d0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
279e0 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
279f0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
27a00 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
27a10 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
27a20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
27a30 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
27a40 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
27a50 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
27a60 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
27a70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
27a80 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
27a90 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
27aa0 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
27ab0 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
27ac0 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
27ad0 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c  c int insertCell
27ae0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
27af0 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
27b00 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
27b10 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
27b20 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
27b30 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
27b40 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
27b50 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
27b60 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
27b70 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
27b80 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
27b90 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
27ba0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
27bb0 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
27bc0 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
27bd0 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
27be0 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
27bf0 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
27c00 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  eded */.  Pgno i
27c10 43 68 69 6c 64 20 20 20 20 20 20 20 2f 2a 20 49  Child       /* I
27c20 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c  f non-zero, repl
27c30 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65  ace first 4 byte
27c40 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75  s with this valu
27c50 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
27c60 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  x;          /* W
27c70 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
27c80 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
27c90 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
27ca0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
27cb0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
27cc0 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
27cd0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
27ce0 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  byte of content 
27cf0 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20  for any cell in 
27d00 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
27d10 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
27d20 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
27d30 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
27d40 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
27d50 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
27d60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
27d70 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
27d80 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
27d90 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
27da0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
27db0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
27dc0 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68  nto data[] of th
27dd0 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
27de0 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
27df0 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
27e00 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
27e10 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
27e20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
27e30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
27e40 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
27e50 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
27e60 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f  *ptr;          /
27e70 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e  * Used for movin
27e80 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72  g information ar
27e90 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a  ound in data[] *
27ea0 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d  /..  int nSkip =
27eb0 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30   (iChild ? 4 : 0
27ec0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  );..  assert( i>
27ed0 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
27ee0 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
27ef0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
27f00 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
27f10 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
27f20 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
27f30 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34  (pPage->pBt)<=54
27f40 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  60 );.  assert( 
27f50 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
27f60 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  <=ArraySize(pPag
27f70 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61  e->aOvfl) );.  a
27f80 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
27f90 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
27fa0 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
27fb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
27fc0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
27fd0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
27fe0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
27ff0 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
28000 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
28010 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
28020 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53   memcpy(pTemp+nS
28030 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  kip, pCell+nSkip
28040 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
28050 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
28060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28070 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
28080 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
28090 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
280a0 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
280b0 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
280c0 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73  ssert( j<(int)(s
280d0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
280e0 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
280f0 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a  ->aOvfl[0])) );.
28100 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
28110 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  [j].pCell = pCel
28120 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  l;.    pPage->aO
28130 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31  vfl[j].idx = (u1
28140 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  6)i;.  }else{.  
28150 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
28160 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
28170 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
28180 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28190 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
281a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
281b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
281c0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
281d0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
281e0 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
281f0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
28200 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
28210 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f  drOffset;.    to
28220 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
28230 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
28240 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
28250 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
28260 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
28270 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
28280 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69  nCell + 2;.    i
28290 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
282a0 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65  + 2*i;.    if( e
282b0 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b  nd > top - sz ){
282c0 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65 66 72  .      rc = defr
282d0 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
282e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
282f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28300 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
28320 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
28330 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
28340 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b     assert( end +
28350 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20   sz <= top );.  
28360 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c    }.    idx = al
28370 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
28380 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65  e, sz);.    asse
28390 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20  rt( idx>0 );.   
283a0 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20   assert( end <= 
283b0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
283c0 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 69 66  dr+5]) );.    if
283d0 20 28 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65   (idx+sz > pPage
283e0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
283f0 65 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e) {.      retur
28400 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
28410 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
28420 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
28430 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
28440 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63  e -= 2;.    memc
28450 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
28460 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
28470 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
28480 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
28490 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64       put4byte(&d
284a0 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64  ata[idx], iChild
284b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
284c0 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64  (j=end-2, ptr=&d
284d0 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
284e0 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
284f0 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
28500 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
28510 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
28520 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
28530 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
28540 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
28550 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
28560 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66  age->nCell);.#if
28570 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28580 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
28590 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
285a0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
285b0 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
285c0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
285d0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
285e0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
285f0 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
28600 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
28610 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
28620 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
28630 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
28640 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
28650 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
28660 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d  e, pCell);.    }
28670 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72  .#endif.  }..  r
28680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
286a0 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f  list of cells to
286b0 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61   a page.  The pa
286c0 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  ge should be ini
286d0 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  tially empty..**
286e0 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67   The cells are g
286f0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74  uaranteed to fit
28700 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
28710 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
28720 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d  emblePage(.  Mem
28730 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
28740 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
28750 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20   assemblied */. 
28760 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
28770 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
28780 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
28790 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f   to this page */
287a0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
287b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73       /* Pointers
287c0 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20   to cell bodies 
287d0 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20  */.  u16 *aSize 
287e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
287f0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a  of the cells */.
28800 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
28810 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
28820 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
28830 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a  pCellptr;     /*
28840 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
28850 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
28860 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
28870 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
28880 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
28890 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  y */.  u8 * cons
288a0 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
288b0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
288c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
288d0 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20   data for pPage 
288e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  */.  const int h
288f0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
28900 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
28910 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
28920 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ader on pPage */
28930 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73  .  const int nUs
28940 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  able = pPage->pB
28950 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  t->usableSize; /
28960 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
28970 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
28980 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
28990 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
289a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
289b0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
289c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
289d0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30  assert( nCell>=0
289e0 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45   && nCell<=MX_CE
289f0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
28a00 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
28a10 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20  >pBt)<=5460 );. 
28a20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
28a30 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28a40 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
28a50 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
28a60 74 68 61 74 20 74 68 65 20 70 61 67 65 20 68 61  that the page ha
28a70 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f  s just been zero
28a80 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29  ed by zeroPage()
28a90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
28aa0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
28ab0 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62  .  assert( get2b
28ac0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
28ad0 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20  )==nUsable );.. 
28ae0 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74   pCellptr = &dat
28af0 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
28b00 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a  set + nCell*2];.
28b10 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73    cellbody = nUs
28b20 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  able;.  for(i=nC
28b30 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ell-1; i>=0; i--
28b40 29 7b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  ){.    pCellptr 
28b50 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f  -= 2;.    cellbo
28b60 64 79 20 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  dy -= aSize[i];.
28b70 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
28b80 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29  llptr, cellbody)
28b90 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
28ba0 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
28bb0 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69  Cell[i], aSize[i
28bc0 5d 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79  ]);.  }.  put2by
28bd0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
28be0 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62   nCell);.  put2b
28bf0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
28c00 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  , cellbody);.  p
28c10 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
28c20 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c  nCell*2 + nUsabl
28c30 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  e - cellbody);. 
28c40 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
28c50 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  (u16)nCell;.}../
28c60 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
28c70 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
28c80 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
28c90 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
28ca0 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
28cb0 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
28cc0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
28cd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
28ce0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
28cf0 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
28d00 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
28d10 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
28d20 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
28d30 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
28d40 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
28d50 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
28d60 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
28d70 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
28d80 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
28d90 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
28da0 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
28db0 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
28dc0 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
28dd0 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
28de0 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
28df0 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
28e00 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
28e10 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
28e20 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
28e30 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
28e40 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
28e50 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
28e60 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
28e70 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
28e80 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
28e90 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
28ea0 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
28eb0 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
28ec0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ee0 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
28ef0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
28f00 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
28f10 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
28f20 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
28f30 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
28f40 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
28f50 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
28f60 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
28f70 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
28f80 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
28f90 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
28fa0 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
28fb0 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
28fc0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
28fd0 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
28fe0 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
28ff0 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
29000 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
29010 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
29020 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
29030 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
29040 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
29050 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
29060 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61  ead of trying ba
29070 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
29080 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
29090 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
290a0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
290b0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
290c0 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
290d0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
290e0 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
290f0 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
29100 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
29110 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
29120 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
29130 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
29140 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
29150 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
29160 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
29170 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
29180 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
29190 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
291a0 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
291b0 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
291c0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
291d0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
291e0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
291f0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
29200 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
29210 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
29220 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
29230 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
29240 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
29250 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
29260 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
29270 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
29280 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
29290 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
292a0 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
292b0 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
292c0 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
292d0 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
292e0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
292f0 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
29300 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
29310 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
29320 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
29330 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
29340 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
29350 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
29360 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
29370 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
29380 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
29390 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
293a0 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
293b0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
293c0 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
293d0 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
293e0 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
293f0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
29400 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
29410 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
29420 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
29430 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
29440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29450 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
29460 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
29470 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
29480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
294a0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
294b0 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
294c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294d0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
294e0 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
294f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29500 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
29510 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
29520 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29530 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
29540 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
29550 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
29560 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
29570 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ow==1 );..  if( 
29580 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20  pPage->nCell<=0 
29590 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
295a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
295b0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
295c0 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61  ew page. This pa
295d0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ge will become t
295e0 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  he right-sibling
295f0 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e   of .  ** pPage.
29600 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74   Make the parent
29610 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20   page writable, 
29620 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
29630 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a  divider cell.  *
29640 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65  * may be inserte
29650 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65  d. If both these
29660 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
29670 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63  successful, proc
29680 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eed..  */.  rc =
29690 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
296a0 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
296b0 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
296c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
296d0 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20  E_OK ){..    u8 
296e0 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b  *pOut = &pSpace[
296f0 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  4];.    u8 *pCel
29700 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  l = pPage->aOvfl
29710 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75  [0].pCell;.    u
29720 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  16 szCell = cell
29730 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
29740 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70  Cell);.    u8 *p
29750 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72  Stop;..    asser
29760 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
29770 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d  swriteable(pNew-
29780 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
29790 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
297a0 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49  aData[0]==(PTF_I
297b0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
297c0 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a  TA|PTF_LEAF) );.
297d0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
297e0 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  w, PTF_INTKEY|PT
297f0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
29800 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  EAF);.    assemb
29810 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
29820 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
29830 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
29840 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
29850 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
29860 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
29870 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
29880 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
29890 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
298a0 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
298b0 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
298c0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
298d0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
298e0 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
298f0 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
29900 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
29910 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
29920 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
29930 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
29940 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
29950 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
29960 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
29970 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
29980 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
29990 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
299a0 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
299b0 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
299c0 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
299d0 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
299e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
299f0 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
29a00 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
29a10 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
29a20 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
29a30 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
29a40 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
29a50 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
29a60 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
29a70 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
29a80 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
29a90 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t->pgno);.      
29aa0 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
29ab0 3e 6d 69 6e 4c 6f 63 61 6c 20 26 26 20 72 63 3d  >minLocal && rc=
29ac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29ad0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
29ae0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
29af0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
29b00 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
29b10 2a 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64  * Create a divid
29b20 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72  er cell to inser
29b30 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  t into pParent. 
29b40 54 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  The divider cell
29b50 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73  .    ** consists
29b60 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67   of a 4-byte pag
29b70 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61  e number (the pa
29b80 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61  ge number of pPa
29b90 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  ge) and.    ** a
29ba0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
29bb0 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63   key value (whic
29bc0 68 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  h must be the sa
29bd0 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a  me value as the.
29be0 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b      ** largest k
29bf0 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20  ey on pPage)..  
29c00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66    **.    ** To f
29c10 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20  ind the largest 
29c20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61  key value on pPa
29c30 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74  ge, first find t
29c40 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20  he right-most . 
29c50 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
29c60 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74  age. The first t
29c70 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69  wo fields of thi
29c80 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a  s cell are the .
29c90 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65      ** record-le
29ca0 6e 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65  ngth (a variable
29cb0 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20   length integer 
29cc0 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20  at most 32-bits 
29cd0 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20  in size).    ** 
29ce0 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75  and the key valu
29cf0 65 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e (a variable le
29d00 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61  ngth integer, ma
29d10 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65  y have any value
29d20 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  )..    ** The fi
29d30 72 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65  rst of the while
29d40 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f  (...) loops belo
29d50 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65  w skips over the
29d60 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20   record-length. 
29d70 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65     ** field. The
29d80 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e   second while(..
29d90 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74  .) loop copies t
29da0 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f  he key value fro
29db0 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c  m the.    ** cel
29dc0 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20  l on pPage into 
29dd0 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
29de0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  r..    */.    pC
29df0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
29e00 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
29e10 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70  ll-1);.    pStop
29e20 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
29e30 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c    while( (*(pCel
29e40 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43  l++)&0x80) && pC
29e50 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20  ell<pStop );.   
29e60 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
29e70 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
29e80 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70  (*(pOut++) = *(p
29e90 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26  Cell++))&0x80) &
29ea0 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
29eb0 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  ..    /* Insert 
29ec0 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
29ed0 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e  cell into pParen
29ee0 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74  t. */.    insert
29ef0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 50 61  Cell(pParent,pPa
29f00 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 70 53 70 61  rent->nCell,pSpa
29f10 63 65 2c 28 69 6e 74 29 28 70 4f 75 74 2d 70 53  ce,(int)(pOut-pS
29f20 70 61 63 65 29 2c 30 2c 70 50 61 67 65 2d 3e 70  pace),0,pPage->p
29f30 67 6e 6f 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  gno);..    /* Se
29f40 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
29f50 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61  d pointer of pPa
29f60 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rent to point to
29f70 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
29f80 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
29f90 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
29fa0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
29fb0 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
29fc0 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
29fd0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
29fe0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
29ff0 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50   */.    releaseP
2a000 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  age(pNew);.  }..
2a010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
2a020 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2a030 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2a040 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  E */..#if 0./*.*
2a050 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a060 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62  does not contrib
2a070 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ute anything to 
2a080 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  the operation of
2a090 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69   SQLite..** it i
2a0a0 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69  s sometimes acti
2a0b0 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c  vated temporaril
2a0c0 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e  y while debuggin
2a0d0 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62  g code responsib
2a0e0 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69  le .** for setti
2a0f0 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ng pointer-map e
2a100 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
2a110 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63  c int ptrmapChec
2a120 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  kPages(MemPage *
2a130 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61  *apPage, int nPa
2a140 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ge){.  int i, j;
2a150 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50  .  for(i=0; i<nP
2a160 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  age; i++){.    P
2a170 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b  gno n;.    u8 e;
2a180 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2a190 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b  age = apPage[i];
2a1a0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
2a1b0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2a1c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a1d0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
2a1e0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
2a1f0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29  age->nCell; j++)
2a200 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  {.      CellInfo
2a210 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20   info;.      u8 
2a220 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20  *z;.     .      
2a230 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  z = findCell(pPa
2a240 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 71  ge, j);.      sq
2a250 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
2a260 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c  ellPtr(pPage, z,
2a270 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69   &info);.      i
2a280 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
2a290 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  w ){.        Pgn
2a2a0 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
2a2b0 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  e(&z[info.iOverf
2a2c0 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  low]);.        p
2a2d0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76  trmapGet(pBt, ov
2a2e0 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  fl, &e, &n);.   
2a2f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2a300 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2a310 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
2a320 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  W1 );.      }.  
2a330 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2a340 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2a350 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
2a360 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20  4byte(z);.      
2a370 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2a380 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2a390 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a3a0 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2a3b0 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
2a3c0 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EE );.      }.  
2a3d0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61    }.    if( !pPa
2a3e0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2a3f0 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
2a400 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2a410 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2a420 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2a430 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2a440 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2a450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2a460 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2a470 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
2a480 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
2a490 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2a4a0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
2a4b0 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
2a4c0 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
2a4d0 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
2a4e0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
2a4f0 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
2a500 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
2a510 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
2a520 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
2a530 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
2a540 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
2a550 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
2a560 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
2a570 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
2a580 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
2a590 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
2a5a0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2a5b0 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
2a5c0 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
2a5d0 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
2a5e0 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
2a5f0 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
2a600 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
2a610 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
2a620 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
2a630 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
2a640 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
2a650 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
2a660 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
2a670 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
2a680 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
2a690 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
2a6a0 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
2a6b0 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
2a6c0 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2a6d0 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
2a6e0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
2a6f0 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
2a700 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
2a710 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
2a720 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
2a730 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
2a740 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
2a750 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
2a760 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
2a770 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2a780 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2a790 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
2a7a0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
2a7b0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
2a7c0 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
2a7d0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
2a7e0 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
2a7f0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
2a800 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
2a810 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
2a820 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
2a830 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
2a840 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
2a850 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
2a860 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
2a870 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
2a880 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
2a890 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
2a8a0 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
2a8b0 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
2a8c0 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
2a8d0 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
2a8e0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
2a8f0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
2a900 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
2a910 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
2a920 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
2a930 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
2a940 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
2a950 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
2a960 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
2a970 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
2a980 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
2a990 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
2a9a0 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
2a9b0 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
2a9c0 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
2a9d0 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
2a9e0 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
2a9f0 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
2aa00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
2aa10 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
2aa20 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
2aa30 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
2aa40 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
2aa50 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
2aa60 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2aa70 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2aa80 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
2aa90 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
2aaa0 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
2aab0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2aac0 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
2aad0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2aae0 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 70 61 67   a.** buffer pag
2aaf0 65 2d 73 69 7a 65 20 62 79 74 65 73 20 69 6e 20  e-size bytes in 
2ab00 73 69 7a 65 2e 20 49 66 2c 20 69 6e 20 69 6e 73  size. If, in ins
2ab10 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
2ab20 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
2ab30 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2c 20  page (pParent), 
2ab40 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2ab50 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c  becomes overfull
2ab60 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73  , this buffer is
2ab70 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
2ab80 65 20 74 68 65 20 70 61 72 65 6e 74 73 20 6f 76  e the parents ov
2ab90 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
2aba0 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2abb0 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
2abc0 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
2abd0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
2abe0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
2abf0 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
2ac00 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
2ac10 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
2ac20 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
2ac30 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
2ac40 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
2ac50 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
2ac60 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
2ac70 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
2ac80 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
2ac90 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
2aca0 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
2acb0 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
2acc0 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
2acd0 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
2ace0 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
2acf0 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
2ad00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
2ad10 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2ad20 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65  ce_nonroot(.  Me
2ad30 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ad50 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20   Parent page of 
2ad60 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62  siblings being b
2ad70 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  alanced */.  int
2ad80 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20   iParentIdx,    
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ada0 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61  Index of "the pa
2adb0 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  ge" in pParent *
2adc0 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61  /.  u8 *aOvflSpa
2add0 63 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ce              
2ade0 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65      /* page-size
2adf0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2ae00 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20  for parent ovfl 
2ae10 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
2ae20 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
2ae30 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
2ae40 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2ae50 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20  int nCell = 0;  
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae70 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
2ae80 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
2ae90 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d   int nMaxCells =
2aea0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2aeb0 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
2aec0 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  of apCell, szCel
2aed0 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69  l, aFrom. */.  i
2aee0 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20  nt nNew = 0;    
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2af00 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2af10 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69  n apNew[] */.  i
2af20 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt nOld;        
2af30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2af40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2af50 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69  n apOld[] */.  i
2af60 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20  nt i, j, k;     
2af70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2af80 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2af90 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20    int nxDiv;    
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2afb0 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73  * Next divider s
2afc0 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  lot in pParent->
2afd0 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
2afe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2aff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b000 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
2b010 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63    int leafCorrec
2b020 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
2b030 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20  * 4 if pPage is 
2b040 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f  a leaf.  0 if no
2b050 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44  t */.  int leafD
2b060 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2b070 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
2b080 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f  Page is a leaf o
2b090 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65  f a LEAFDATA tre
2b0a0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
2b0b0 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  eSpace;         
2b0c0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20      /* Bytes in 
2b0d0 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65  pPage beyond the
2b0e0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
2b0f0 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20   pageFlags;     
2b100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
2b110 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  ue of pPage->aDa
2b120 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ta[0] */.  int s
2b130 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20  ubtotal;        
2b140 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f          /* Subto
2b150 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20  tal of bytes in 
2b160 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67  cells on one pag
2b170 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63  e */.  int iSpac
2b180 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
2b190 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
2b1a0 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61  sed byte of aSpa
2b1b0 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ce1[] */.  int i
2b1c0 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20 20  OvflSpace = 0;  
2b1d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2b1e0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
2b1f0 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a  aOvflSpace[] */.
2b200 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b    int szScratch;
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b220 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63  * Size of scratc
2b230 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74  h memory request
2b240 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ed */.  MemPage 
2b250 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  *apOld[NB];     
2b260 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
2b270 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c  d up to two sibl
2b280 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ings */.  MemPag
2b290 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20  e *apCopy[NB];  
2b2a0 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74         /* Privat
2b2b0 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c  e copies of apOl
2b2c0 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d  d[] pages */.  M
2b2d0 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42  emPage *apNew[NB
2b2e0 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70  +2];        /* p
2b2f0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
2b300 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72  B siblings after
2b310 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20   balancing */.  
2b320 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20  u8 *pRight;     
2b330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b340 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72 65  Location in pare
2b350 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62 6c  nt of right-sibl
2b360 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ing pointer */. 
2b370 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d   u8 *apDiv[NB-1]
2b380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2b390 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   Divider cells i
2b3a0 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  n pParent */.  i
2b3b0 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b  nt cntNew[NB+2];
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b3d0 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20  ndex in aCell[] 
2b3e0 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d  of cell after i-
2b3f0 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  th page */.  int
2b400 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20   szNew[NB+2];   
2b410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2b420 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65  bined size of ce
2b430 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74  lls place on i-t
2b440 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  h page */.  u8 *
2b450 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20  *apCell = 0;    
2b460 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
2b470 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61  cells begin bala
2b480 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73  nced */.  u16 *s
2b490 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zCell;          
2b4a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
2b4b0 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
2b4c0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
2b4d0 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20  .  u8 *aSpace1; 
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70  /* Space for cop
2b500 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20  ies of dividers 
2b510 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  cells */.  Pgno 
2b520 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
2b530 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
2b540 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20 70  var to store a p
2b550 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f  age number in */
2b560 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65 6e  ..  pBt = pParen
2b570 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  t->pBt;.  assert
2b580 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2b590 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2b5a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2b5b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2b5c0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
2b5d0 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66 20  DbPage) );..#if 
2b5e0 30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  0.  TRACE(("BALA
2b5f0 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20  NCE: begin page 
2b600 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e  %d child of %d\n
2b610 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
2b620 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b  pParent->pgno));
2b630 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74  .#endif..  /* At
2b640 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61 72   this point pPar
2b650 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74 20  ent may have at 
2b660 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f  most one overflo
2b670 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20  w cell. And if. 
2b680 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   ** this overflo
2b690 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65 6e  w cell is presen
2b6a0 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68  t, it must be th
2b6b0 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a  e cell with .  *
2b6c0 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74 49  * index iParentI
2b6d0 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72 69  dx. This scenari
2b6e0 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68  o comes about wh
2b6f0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2b700 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
2b710 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72 6f  (indirectly) fro
2b720 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  m sqlite3BtreeDe
2b730 6c 65 74 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73  lete(). */.  ass
2b740 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ert( pParent->nO
2b750 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50  verflow==0 || pP
2b760 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2b770 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2b780 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2b790 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  low==0 || pParen
2b7a0 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  t->aOvfl[0].idx=
2b7b0 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a  =iParentIdx );..
2b7c0 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63    if( !aOvflSpac
2b7d0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2b7e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2b7f0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
2b800 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
2b810 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20  o balance. Also 
2b820 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73  locate the cells
2b830 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a   in pParent .  *
2b840 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68  * that divide th
2b850 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61  e siblings. An a
2b860 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
2b870 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e  o find NN siblin
2b880 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68  gs on .  ** eith
2b890 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
2b8a0 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  . More siblings 
2b8b0 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f  are taken from o
2b8c0 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72  ne side, however
2b8d0 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  , .  ** if there
2b8e0 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
2b8f0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
2b900 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49  he other side. I
2b910 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68  f pParent.  ** h
2b920 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63  as NB or fewer c
2b930 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c  hildren then all
2b940 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
2b950 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20  rent are taken. 
2b960 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
2b970 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73   loop also drops
2b980 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
2b990 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ls from the pare
2b9a0 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20  nt page. This.  
2b9b0 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61  ** way, the rema
2b9c0 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e  inder of the fun
2b9d0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68  ction does not h
2b9e0 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ave to deal with
2b9f0 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c   any.  ** overfl
2ba00 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  ow cells in the 
2ba10 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61 73 20  parent page, as 
2ba20 69 66 20 6f 6e 65 20 65 78 69 73 74 65 64 20 69  if one existed i
2ba30 74 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  t has already.  
2ba40 2a 2a 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  ** been removed.
2ba50 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65    */.  i = pPare
2ba60 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20  nt->nOverflow + 
2ba70 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a  pParent->nCell;.
2ba80 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20    if( i<2 ){.   
2ba90 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20   nxDiv = 0;.    
2baa0 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65  nOld = i+1;.  }e
2bab0 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  lse{.    nOld = 
2bac0 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65  3;.    if( iPare
2bad0 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20  ntIdx==0 ){     
2bae0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
2baf0 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
2bb00 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72    }else if( iPar
2bb10 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20  entIdx==i ){.   
2bb20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a     nxDiv = i-2;.
2bb30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bb40 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74   nxDiv = iParent
2bb50 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  Idx-1;.    }.   
2bb60 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66   i = 2;.  }.  if
2bb70 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  ( (i+nxDiv-pPare
2bb80 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d  nt->nOverflow)==
2bb90 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2bba0 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26  {.    pRight = &
2bbb0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2bbc0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2bbd0 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t+8];.  }else{. 
2bbe0 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64     pRight = find
2bbf0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
2bc00 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2bc10 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20  Overflow);.  }. 
2bc20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2bc30 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c  (pRight);.  whil
2bc40 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  e( 1 ){.    rc =
2bc50 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2bc60 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c  pBt, pgno, &apOl
2bc70 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
2bc80 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  c ){.      memse
2bc90 74 28 61 70 4f 6c 64 2c 20 30 2c 20 69 2a 73 69  t(apOld, 0, i*si
2bca0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b  zeof(MemPage*));
2bcb0 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  .      goto bala
2bcc0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2bcd0 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73   }.    nMaxCells
2bce0 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
2bcf0 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
2bd00 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
2bd10 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72  f( (i--)==0 ) br
2bd20 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  eak;..    if( pP
2bd30 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2bd40 20 26 26 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61   && i+nxDiv==pPa
2bd50 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  rent->aOvfl[0].i
2bd60 64 78 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69  dx ){.      apDi
2bd70 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e  v[i] = pParent->
2bd80 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
2bd90 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
2bda0 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
2bdb0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
2bdc0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2bdd0 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
2bde0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
2bdf0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
2be00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2be10 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
2be20 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
2be30 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2be40 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20  Overflow);.     
2be50 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2be60 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
2be70 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
2be80 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
2be90 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20  , apDiv[i]);..  
2bea0 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
2beb0 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61  cell from the pa
2bec0 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76  rent page. apDiv
2bed0 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73  [i] still points
2bee0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
2bef0 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65   cell within the
2bf00 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68   parent, even th
2bf10 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e  ough it has been
2bf20 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20   dropped..      
2bf30 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20  ** This is safe 
2bf40 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67  because dropping
2bf50 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65   a cell only ove
2bf60 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73  rwrites the firs
2bf70 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
2bf80 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64  bytes of it, and
2bf90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
2bfa0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65  oes not need the
2bfb0 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
2bfc0 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68  four bytes of th
2bfd0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  e divider cell. 
2bfe0 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  So the pointer i
2bff0 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20  s safe to use.  
2c000 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e      ** later on.
2c010 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20    .      **.    
2c020 20 20 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69    ** Unless SQLi
2c030 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69  te is compiled i
2c040 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
2c050 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  mode. In this ca
2c060 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  se,.      ** the
2c070 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74   dropCell() rout
2c080 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ine will overwri
2c090 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  te the entire ce
2c0a0 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a  ll with zeroes..
2c0b0 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
2c0c0 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69   case, temporari
2c0d0 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c  ly copy the cell
2c0e0 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53   into the aOvflS
2c0f0 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  pace[].      ** 
2c100 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20  buffer. It will 
2c110 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67  be copied out ag
2c120 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ain as soon as t
2c130 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66  he aSpace[] buff
2c140 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  er.      ** is a
2c150 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 23 69  llocated.  */.#i
2c160 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
2c170 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  RE_DELETE.      
2c180 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61  memcpy(&aOvflSpa
2c190 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72  ce[apDiv[i]-pPar
2c1a0 65 6e 74 2d 3e 61 44 61 74 61 5d 2c 20 61 70 44  ent->aData], apD
2c1b0 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29  iv[i], szNew[i])
2c1c0 3b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  ;.      apDiv[i]
2c1d0 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61   = &aOvflSpace[a
2c1e0 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d  pDiv[i]-pParent-
2c1f0 3e 61 44 61 74 61 5d 3b 0a 23 65 6e 64 69 66 0a  >aData];.#endif.
2c200 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
2c210 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
2c220 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2c230 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20  ow, szNew[i]);. 
2c240 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2c250 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20  ake nMaxCells a 
2c260 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e  multiple of 4 in
2c270 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72   order to preser
2c280 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61  ve 8-byte.  ** a
2c290 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d  lignment */.  nM
2c2a0 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43  axCells = (nMaxC
2c2b0 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20  ells + 3)&~3;.. 
2c2c0 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
2c2d0 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
2c2e0 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20  ry structures.  
2c2f0 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61  */.  k = pBt->pa
2c300 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28  geSize + ROUND8(
2c310 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
2c320 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a  ;.  szScratch =.
2c330 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73         nMaxCells
2c340 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20  *sizeof(u8*)    
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c360 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a     /* apCell */.
2c370 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73       + nMaxCells
2c380 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20  *sizeof(u16)    
2c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3a0 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a     /* szCell */.
2c3b0 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65       + pBt->page
2c3c0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3e0 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f     /* aSpace1 */
2c3f0 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20  .     + k*nOld; 
2c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c420 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69      /* Page copi
2c430 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20  es (apCopy) */. 
2c440 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
2c450 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20  3ScratchMalloc( 
2c460 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20  szScratch ); .  
2c470 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b  if( apCell==0 ){
2c480 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c490 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
2c4a0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2c4b0 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
2c4c0 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e   (u16*)&apCell[n
2c4d0 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70  MaxCells];.  aSp
2c4e0 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43  ace1 = (u8*)&szC
2c4f0 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
2c500 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2c510 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61  BYTE_ALIGNMENT(a
2c520 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a  Space1) );..  /*
2c530 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74  .  ** Load point
2c540 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73  ers to all cells
2c550 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65   on sibling page
2c560 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  s and the divide
2c570 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
2c580 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65  o the local apCe
2c590 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b  ll[] array.  Mak
2c5a0 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
2c5b0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
2c5c0 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  ** into space ob
2c5d0 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61  tained from aSpa
2c5e0 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65  ce1[] and remove
2c5f0 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72   the the divider
2c600 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   Cells.  ** from
2c610 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
2c620 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
2c630 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
2c640 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
2c650 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
2c660 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
2c670 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
2c680 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
2c690 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
2c6a0 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
2c6b0 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e   into aSpace1[].
2c6c0 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
2c6d0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
2c6e0 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
2c6f0 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
2c700 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
2c710 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
2c720 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
2c730 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
2c740 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
2c750 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
2c760 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
2c770 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
2c780 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
2c790 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
2c7a0 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
2c7b0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
2c7c0 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
2c7d0 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
2c7e0 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
2c7f0 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
2c800 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
2c810 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
2c820 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61  keys..  */.  lea
2c830 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70  fCorrection = ap
2c840 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a  Old[0]->leaf*4;.
2c850 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f    leafData = apO
2c860 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a  ld[0]->hasData;.
2c870 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
2c880 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  d; i++){.    int
2c890 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20   limit;.    .   
2c8a0 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
2c8b0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
2c8c0 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  take a copy of t
2c8d0 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c  he i'th original
2c8e0 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20   sibling.    ** 
2c8f0 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  The rest of this
2c900 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75   function will u
2c910 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  se data from the
2c920 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20   copies rather. 
2c930 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f     ** that the o
2c940 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69  riginal pages si
2c950 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nce the original
2c960 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69   pages will be i
2c970 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f  n the.    ** pro
2c980 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76  cess of being ov
2c990 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20  erwritten.  */. 
2c9a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
2c9b0 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28   = apCopy[i] = (
2c9c0 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65  MemPage*)&aSpace
2c9d0 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  1[pBt->pageSize 
2c9e0 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63  + k*i];.    memc
2c9f0 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69  py(pOld, apOld[i
2ca00 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  ], sizeof(MemPag
2ca10 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61  e));.    pOld->a
2ca20 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70  Data = (void*)&p
2ca30 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  Old[1];.    memc
2ca40 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20  py(pOld->aData, 
2ca50 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c  apOld[i]->aData,
2ca60 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
2ca70 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f  ..    limit = pO
2ca80 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e  ld->nCell+pOld->
2ca90 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66  nOverflow;.    f
2caa0 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
2cab0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
2cac0 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
2cad0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70  ells );.      ap
2cae0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
2caf0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2cb00 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73  Old, j);.      s
2cb10 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
2cb20 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
2cb30 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
2cb40 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a  .      nCell++;.
2cb50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
2cb60 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44  nOld-1 && !leafD
2cb70 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20  ata){.      u16 
2cb80 73 7a 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 0a 20  sz = szNew[i];. 
2cb90 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
2cba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2cbb0 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2cbc0 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
2cbd0 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
2cbe0 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
2cbf0 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
2cc00 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
2cc10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
2cc20 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  z<=pBt->pageSize
2cc30 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  /4 );.      asse
2cc40 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74  rt( iSpace1<=pBt
2cc50 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
2cc60 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
2cc70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
2cc80 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
2cc90 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
2cca0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
2ccb0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
2ccc0 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
2ccd0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2cce0 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
2ccf0 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 28 75 31 36  l[nCell] -= (u16
2cd00 29 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b  )leafCorrection;
2cd10 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64  .      if( !pOld
2cd20 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2cd30 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2cd40 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
2cd50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2cd60 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  Old->hdrOffset==
2cd70 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
2cd80 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
2cd90 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
2cda0 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
2cdb0 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
2cdc0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
2cdd0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2cde0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
2cdf0 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
2ce00 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38  , &pOld->aData[8
2ce10 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ], 4);.      }el
2ce20 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
2ce30 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
2ce40 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20  on==4 );.       
2ce50 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
2ce60 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
2ce70 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
2ce80 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
2ce90 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
2cea0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
2ceb0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34  zCell[nCell] = 4
2cec0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ced0 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b    }.      nCell+
2cee0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
2cef0 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
2cf00 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
2cf10 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
2cf20 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
2cf30 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
2cf40 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
2cf50 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
2cf60 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
2cf70 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
2cf80 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
2cf90 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
2cfa0 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
2cfb0 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
2cfc0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
2cfd0 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
2cfe0 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
2cff0 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
2d000 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
2d010 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
2d020 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
2d030 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
2d040 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
2d050 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
2d060 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
2d070 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2d080 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
2d090 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
2d0a0 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
2d0b0 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
2d0c0 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
2d0d0 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
2d0e0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
2d0f0 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
2d100 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
2d110 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
2d120 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
2d130 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
2d140 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
2d150 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
2d160 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
2d170 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
2d180 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
2d190 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
2d1a0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
2d1b0 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
2d1c0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
2d1d0 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
2d1e0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
2d1f0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
2d200 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
2d210 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
2d220 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
2d230 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
2d240 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
2d250 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
2d260 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
2d270 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
2d280 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
2d290 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
2d2a0 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
2d2b0 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
2d2c0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e  ++;.      if( k>
2d2d0 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c  NB+1 ){ rc = SQL
2d2e0 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 67 6f 74  ITE_CORRUPT; got
2d2f0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2d300 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p; }.    }.  }. 
2d310 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
2d320 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
2d330 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
2d340 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
2d350 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
2d360 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
2d370 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
2d380 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
2d390 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
2d3a0 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
2d3b0 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
2d3c0 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
2d3d0 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
2d3e0 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
2d3f0 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
2d400 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
2d410 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
2d420 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
2d430 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
2d440 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
2d450 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
2d460 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
2d470 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
2d480 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
2d490 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
2d4a0 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
2d4b0 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
2d4c0 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
2d4d0 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
2d4e0 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
2d4f0 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
2d500 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
2d510 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
2d520 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
2d530 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
2d540 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
2d550 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
2d560 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
2d570 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
2d580 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
2d590 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
2d5a0 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
2d5b0 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
2d5c0 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
2d5d0 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
2d5e0 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
2d5f0 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
2d600 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2d610 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
2d620 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
2d630 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
2d640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d650 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
2d660 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
2d670 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
2d680 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
2d690 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
2d6a0 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
2d6b0 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
2d6c0 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
2d6d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
2d6e0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2d6f0 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
2d700 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73  ==0 || szRight+s
2d710 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
2d720 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
2d730 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
2d740 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
2d750 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
2d760 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
2d770 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
2d780 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
2d790 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
2d7a0 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
2d7b0 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
2d7c0 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
2d7d0 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
2d7e0 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
2d7f0 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
2d800 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
2d810 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
2d820 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
2d830 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a   or pPage is.  *
2d840 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
2d850 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
2d860 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
2d870 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
2d880 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
2d890 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
2d8a0 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
2d8b0 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
2d8c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  */.  assert( cnt
2d8d0 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
2d8e0 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
2d8f0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
2d900 3d 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28  =0) );..  TRACE(
2d910 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
2d920 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20  %d %d %d  ",.   
2d930 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c   apOld[0]->pgno,
2d940 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
2d950 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a  apOld[1]->pgno :
2d960 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20   0,.    nOld>=3 
2d970 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f  ? apOld[2]->pgno
2d980 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a   : 0.  ));..  /*
2d990 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
2d9a0 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
2d9b0 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
2d9c0 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
2d9d0 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d  /.  if( apOld[0]
2d9e0 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20  ->pgno<=1 ){.   
2d9f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2da00 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62  RUPT;.    goto b
2da10 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2da20 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20    }.  pageFlags 
2da30 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74  = apOld[0]->aDat
2da40 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
2da50 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
2da60 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
2da70 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
2da80 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
2da90 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
2daa0 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69  ];.      apOld[i
2dab0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  ] = 0;.      rc 
2dac0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2dad0 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ite(pNew->pDbPag
2dae0 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  e);.      nNew++
2daf0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2db00 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2db10 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
2db20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2db30 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  i>0 );.      rc 
2db40 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2db50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
2db60 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b  &pgno, pgno, 0);
2db70 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2db80 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2db90 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
2dba0 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
2dbb0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20     nNew++;..    
2dbc0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69    /* Set the poi
2dbd0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
2dbe0 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  or the new sibli
2dbf0 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
2dc00 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2dc10 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  UM ){.        rc
2dc20 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2dc30 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54  , pNew->pgno, PT
2dc40 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
2dc50 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
2dc60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2dc70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2dc80 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2dc90 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
2dca0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2dcb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
2dcc0 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
2dcd0 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
2dce0 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
2dcf0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
2dd00 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20  <nOld ){.    rc 
2dd10 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64  = freePage(apOld
2dd20 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
2dd30 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
2dd40 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
2dd50 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
2dd60 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
2dd70 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
2dd80 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
2dd90 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
2dda0 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
2ddb0 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
2ddc0 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
2ddd0 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
2dde0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
2ddf0 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
2de00 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
2de10 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
2de20 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
2de30 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
2de40 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
2de50 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
2de60 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
2de70 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
2de80 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
2de90 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
2dea0 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
2deb0 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
2dec0 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
2ded0 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
2dee0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
2def0 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
2df00 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
2df10 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
2df20 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
2df30 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
2df40 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
2df50 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
2df60 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
2df70 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
2df80 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
2df90 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
2dfa0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2dfb0 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
2dfc0 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65   int minV = apNe
2dfd0 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[i]->pgno;.    
2dfe0 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
2dff0 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
2e000 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
2e010 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f  ( apNew[j]->pgno
2e020 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
2e030 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
2e040 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
2e050 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  V = apNew[j]->pg
2e060 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
2e070 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
2e080 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b   ){.      int t;
2e090 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
2e0a0 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 61 70  pT;.      t = ap
2e0b0 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[i]->pgno;.  
2e0c0 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
2e0d0 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
2e0e0 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
2e0f0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
2e100 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
2e110 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77   }.  TRACE(("new
2e120 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
2e130 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
2e140 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e  (%d)\n",.    apN
2e150 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e  ew[0]->pgno, szN
2e160 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
2e170 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70  =2 ? apNew[1]->p
2e180 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  gno : 0, nNew>=2
2e190 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
2e1a0 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61  .    nNew>=3 ? a
2e1b0 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[2]->pgno : 
2e1c0 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
2e1d0 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
2e1e0 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33  New>=4 ? apNew[3
2e1f0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
2e200 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
2e210 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
2e220 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e   ? apNew[4]->pgn
2e230 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  o : 0, nNew>=5 ?
2e240 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
2e250 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2e260 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e270 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2e280 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62  Page) );.  put4b
2e290 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65  yte(pRight, apNe
2e2a0 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
2e2b0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
2e2c0 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
2e2d0 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
2e2e0 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
2e2f0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
2e300 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
2e310 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
2e320 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
2e330 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
2e340 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
2e350 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
2e360 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
2e370 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
2e380 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
2e390 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
2e3a0 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
2e3b0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f  ells );.    zero
2e3c0 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
2e3d0 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d  lags);.    assem
2e3e0 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
2e3f0 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
2e400 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
2e410 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
2e420 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
2e430 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
2e440 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
2e450 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2e460 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2e470 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
2e480 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
2e490 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
2e4a0 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
2e4b0 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
2e4c0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
2e4d0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
2e4e0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
2e4f0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2e500 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2e510 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c  ( i<nNew-1 && j<
2e520 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
2e530 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
2e540 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
2e550 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
2e560 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
2e570 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
2e580 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
2e590 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
2e5a0 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
2e5b0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
2e5c0 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  mp = &aOvflSpace
2e5d0 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20  [iOvflSpace];.  
2e5e0 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
2e5f0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
2e600 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
2e610 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
2e620 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2e630 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
2e640 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2e650 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
2e660 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
2e670 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
2e680 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
2e690 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
2e6a0 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
2e6b0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
2e6c0 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
2e6d0 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
2e6e0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
2e6f0 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
2e700 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
2e710 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
2e720 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
2e730 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
2e740 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
2e750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e760 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2e770 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
2e780 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2e790 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
2e7a0 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
2e7b0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
2e7c0 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
2e7d0 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70        sz = 4 + p
2e7e0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
2e7f0 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  4], info.nKey);.
2e800 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
2e810 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2e820 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d          pCell -=
2e830 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   4;.        /* O
2e840 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
2e850 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
2e860 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
2e870 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
2e880 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
2e890 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
2e8a0 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
2e8b0 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65  ts reported size
2e8c0 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a   was 4.        *
2e8d0 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74  * bytes, then it
2e8e0 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
2e8f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
2e900 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  is .        ** (
2e910 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  see sqlite3Btree
2e920 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
2e930 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d  4 bytes is the m
2e940 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20  inimum size of. 
2e950 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65         ** any ce
2e960 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69  ll). But it is i
2e970 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
2e980 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
2e990 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
2e9a0 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
2e9b0 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
2e9c0 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll now..        
2e9d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
2e9e0 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e  te that this can
2e9f0 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e   never happen in
2ea00 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20   an SQLite data 
2ea10 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20  file, as all.   
2ea20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72       ** cells ar
2ea30 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  e at least 4 byt
2ea40 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70  es. It only happ
2ea50 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75  ens in b-trees u
2ea60 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  sed.        ** t
2ea70 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28  o evaluate "IN (
2ea80 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64  SELECT ...)" and
2ea90 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73   similar clauses
2eaa0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2eab0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
2eac0 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  j]==4 ){.       
2ead0 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f     assert(leafCo
2eae0 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20  rrection==4);.  
2eaf0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
2eb00 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
2eb10 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
2eb20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2eb30 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20    iOvflSpace += 
2eb40 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
2eb50 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
2eb60 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61  ize/4 );.      a
2eb70 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63  ssert( iOvflSpac
2eb80 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
2eb90 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   );.      rc = i
2eba0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
2ebb0 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
2ebc0 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77   sz, pTemp, pNew
2ebd0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
2ebe0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ebf0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
2ec00 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
2ec10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2ec20 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2ec30 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
2ec40 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a   );..      j++;.
2ec50 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
2ec60 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2ec70 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
2ec80 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
2ec90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
2eca0 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
2ecb0 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
2ecc0 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38  AF)==0 ){.    u8
2ecd0 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f   *zChild = &apCo
2ece0 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74  py[nOld-1]->aDat
2ecf0 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  a[8];.    memcpy
2ed00 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  (&apNew[nNew-1]-
2ed10 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c  >aData[8], zChil
2ed20 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d, 4);.  }..  /*
2ed30 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   Fix the pointer
2ed40 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
2ed50 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74   all the cells t
2ed60 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65 64  hat were shifted
2ed70 20 61 72 6f 75 6e 64 2e 20 0a 20 20 2a 2a 20 54   around. .  ** T
2ed80 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c  here are several
2ed90 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
2eda0 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   of pointer-map 
2edb0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e 65 65  entries that nee
2edc0 64 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 65 61  d to.  ** be dea
2edd0 6c 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20  lt with by this 
2ede0 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66  routine. Some of
2edf0 20 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e   these have been
2ee00 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75   set already, bu
2ee10 74 0a 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65  t.  ** many have
2ee20 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77   not. The follow
2ee30 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79  ing is a summary
2ee40 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29  :.  **.  **   1)
2ee50 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73   The entries ass
2ee60 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77  ociated with new
2ee70 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
2ee80 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 2a  hat were not.  *
2ee90 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20  *      siblings 
2eea0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2eeb0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54  on was called. T
2eec0 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64  hese have alread
2eed0 79 0a 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e  y.  **      been
2eee0 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e   set. We don't n
2eef0 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f  eed to worry abo
2ef00 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20  ut old siblings 
2ef10 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 20  that were.  **  
2ef20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65      moved to the
2ef30 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65   free-list - the
2ef40 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64 65   freePage() code
2ef50 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a   has taken care.
2ef60 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f    **      of tho
2ef70 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  se..  **.  **   
2ef80 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d  2) The pointer-m
2ef90 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  ap entries assoc
2efa0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
2efb0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20  irst overflow.  
2efc0 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e 20  **      page in 
2efd0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  any overflow cha
2efe0 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77 20  ins used by new 
2eff0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54  divider cells. T
2f000 68 65 73 65 20 0a 20 20 2a 2a 20 20 20 20 20 20  hese .  **      
2f010 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64  have also alread
2f020 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72  y been taken car
2f030 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65  e of by the inse
2f040 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20  rtCell() code.. 
2f050 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 29 20 49 66   **.  **   3) If
2f060 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
2f070 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
2f080 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
2f090 64 20 70 61 67 65 73 20 6f 66 0a 20 20 2a 2a 20  d pages of.  ** 
2f0a0 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65       cells store
2f0b0 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67  d on the sibling
2f0c0 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20   pages may need 
2f0d0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
2f0e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 34 29 20 49 66   **.  **   4) If
2f0f0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
2f100 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  es are not inter
2f110 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
2f120 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 2a 2a 20  , then any.  ** 
2f130 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
2f140 67 65 73 20 75 73 65 64 20 62 79 20 74 68 65 73  ges used by thes
2f150 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64  e cells may need
2f160 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20   to be updated. 
2f170 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e   **      (intern
2f180 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20  al intkey nodes 
2f190 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f  never contain po
2f1a0 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c  inters to overfl
2f1b0 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 2a 2a 0a  ow pages)..  **.
2f1c0 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65    **   5) If the
2f1d0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
2f1e0 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
2f1f0 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
2f200 6d 61 70 0a 20 20 2a 2a 20 20 20 20 20 20 65 6e  map.  **      en
2f210 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69  tries for the ri
2f220 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20  ght-child pages 
2f230 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20  of each sibling 
2f240 6d 61 79 20 6e 65 65 64 0a 20 20 2a 2a 20 20 20  may need.  **   
2f250 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65 64     to be updated
2f260 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 61 73 65  ..  **.  ** Case
2f270 73 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65  s 1 and 2 are de
2f280 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62  alt with above b
2f290 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68  y other code. Th
2f2a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
2f2b0 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
2f2c0 68 20 63 61 73 65 73 20 33 20 61 6e 64 20 34 2e  h cases 3 and 4.
2f2d0 20 53 69 6e 63 65 20 73 65 74 74 69 6e 67 20 61   Since setting a
2f2e0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
2f2f0 72 79 0a 20 20 2a 2a 20 69 73 20 61 20 72 65 6c  ry.  ** is a rel
2f300 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76  atively expensiv
2f310 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69  e operation, thi
2f320 73 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73  s code only sets
2f330 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 6d 61   pointer.  ** ma
2f340 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68  p entries for ch
2f350 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
2f360 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20  pages that have 
2f370 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 0a 20  actually moved. 
2f380 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 61 67 65   ** between page
2f390 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  s.  */.  if( ISA
2f3a0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2f3b0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
2f3c0 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d   apNew[0];.    M
2f3d0 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
2f3e0 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e  pCopy[0];.    in
2f3f0 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f  t nOverflow = pO
2f400 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
2f410 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20     int iNextOld 
2f420 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  = pOld->nCell + 
2f430 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
2f440 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  nt iOverflow = (
2f450 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64  nOverflow ? pOld
2f460 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a  ->aOvfl[0].idx :
2f470 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b   -1);.    j = 0;
2f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f4a0 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69  Current 'old' si
2f4b0 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20  bling page */.  
2f4c0 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20    k = 0;        
2f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4e0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2f4f0 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61  'new' sibling pa
2f500 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ge */.    for(i=
2f510 30 3b 20 69 3c 6e 43 65 6c 6c 20 26 26 20 72 63  0; i<nCell && rc
2f520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
2f530 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44  ){.      int isD
2f540 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  ivider = 0;.    
2f550 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78    while( i==iNex
2f560 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tOld ){.        
2f570 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
2f580 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
2f590 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
2f5a0 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64  last cell on old
2f5b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
2f5c0 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74  ing page j. If t
2f5d0 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
2f5e0 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
2f5f0 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
2f600 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
2f610 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61  hen cell i was a
2f620 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a   divider cell. *
2f630 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d  /.        pOld =
2f640 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20   apCopy[++j];.  
2f650 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d        iNextOld =
2f660 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
2f670 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70   pOld->nCell + p
2f680 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
2f690 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
2f6a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
2f6b0 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c           nOverfl
2f6c0 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ow = pOld->nOver
2f6d0 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  flow;.          
2f6e0 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20  iOverflow = i + 
2f6f0 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
2f700 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a  ->aOvfl[0].idx;.
2f710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f720 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c    isDivider = !l
2f730 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20  eafData;  .     
2f740 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2f750 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  (nOverflow>0 || 
2f760 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20  iOverflow<i );. 
2f770 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
2f780 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d  rflow<2 || pOld-
2f790 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
2f7a0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64  Old->aOvfl[1].id
2f7b0 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x-1);.      asse
2f7c0 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c  rt(nOverflow<3 |
2f7d0 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  | pOld->aOvfl[1]
2f7e0 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66  .idx==pOld->aOvf
2f7f0 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20  l[2].idx-1);.   
2f800 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66     if( i==iOverf
2f810 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  low ){.        i
2f820 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20  sDivider = 1;.  
2f830 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76        if( (--nOv
2f840 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20  erflow)>0 ){.   
2f850 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77         iOverflow
2f860 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
2f870 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2f880 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b   i==cntNew[k] ){
2f890 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  .        /* Cell
2f8a0 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69   i is the cell i
2f8b0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
2f8c0 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65  wing the last ce
2f8d0 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20  ll on new.      
2f8e0 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67    ** sibling pag
2f8f0 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c  e k. If the sibl
2f900 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
2f910 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20  f pages of an.  
2f920 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20        ** intkey 
2f930 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c  b-tree, then cel
2f940 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72  l i is a divider
2f950 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   cell.  */.     
2f960 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
2f970 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  ++k];.        if
2f980 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f  ( !leafData ) co
2f990 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2f9a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2f9b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2f9c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
2f9d0 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
2f9e0 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
2f9f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2fa00 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
2fa10 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
2fa20 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
2fa30 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
2fa40 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
2fa50 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
2fa60 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
2fa70 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
2fa80 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
2fa90 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
2faa0 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
2fab0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
2fac0 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
2fad0 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
2fae0 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
2faf0 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
2fb00 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
2fb10 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
2fb20 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
2fb30 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
2fb40 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
2fb50 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
2fb60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2fb70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
2fb80 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d  t4byte(apCell[i]
2fb90 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
2fba0 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20   pNew->pgno);.  
2fbb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fbc0 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
2fbd0 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26 26 20  ew->minLocal && 
2fbe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fbf0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2fc00 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2fc10 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d  (pNew, apCell[i]
2fc20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2fc30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2fc40 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74  if( !leafCorrect
2fc50 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ion ){.      for
2fc60 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
2fc70 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65 77 3b 20 69  _OK && i<nNew; i
2fc80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ++){.        rc 
2fc90 3d 20 70 74 72 6d 61 70 50 75 74 28 0a 09 20 20  = ptrmapPut(..  
2fca0 20 20 70 42 74 2c 20 67 65 74 34 62 79 74 65 28    pBt, get4byte(
2fcb0 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61  &apNew[i]->aData
2fcc0 5b 38 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  [8]), PTRMAP_BTR
2fcd0 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  EE, apNew[i]->pg
2fce0 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
2fcf0 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a   }..#if 0.    /*
2fd00 20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b   The ptrmapCheck
2fd10 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73  Pages() contains
2fd20 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
2fd30 65 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79  ents that verify
2fd40 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c   that.    ** all
2fd50 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
2fd60 65 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65  es are set corre
2fd70 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65  ctly. This is he
2fd80 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20  lpful while .   
2fd90 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54   ** debugging. T
2fda0 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64  his is usually d
2fdb0 69 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20  isabled because 
2fdc0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
2fdd0 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61  se may.    ** ca
2fde0 75 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20  use an assert() 
2fdf0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69  statement to fai
2fe00 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61  l.  */.    ptrma
2fe10 70 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65  pCheckPages(apNe
2fe20 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74  w, nNew);.    pt
2fe30 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26  rmapCheckPages(&
2fe40 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e  pParent, 1);.#en
2fe50 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  dif.  }..  asser
2fe60 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e  t( pParent->isIn
2fe70 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  it );.  TRACE(("
2fe80 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65  BALANCE: finishe
2fe90 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
2fea0 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
2feb0 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e          nOld, nN
2fec0 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 0a 20  ew, nCell));. . 
2fed0 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
2fee0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2fef0 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
2ff00 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
2ff10 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70  e3ScratchFree(ap
2ff20 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Cell);.  for(i=0
2ff30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
2ff40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ff50 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apOld[i]);.  }. 
2ff60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
2ff70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
2ff80 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d  asePage(apNew[i]
2ff90 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2ffa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2ffb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2ffc0 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20  sed to copy the 
2ffd0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2ffe0 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72  b-tree node stor
2fff0 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70  ed .** on page p
30000 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
30010 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20  . If page pFrom 
30020 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70  was not a leaf p
30030 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  age, then.** the
30040 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
30050 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68  ries for each ch
30060 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64  ild page are upd
30070 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
30080 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20  .** parent page 
30090 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
300a0 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67  inter map is pag
300b0 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20  e pTo. If pFrom 
300c0 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79  contained.** any
300d0 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72   cells with over
300e0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
300f0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72  rs, then the cor
30100 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74  responding point
30110 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
30120 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74  s are also updat
30130 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  ed so that the p
30140 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61  arent page is pa
30150 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ge pTo..**.** If
30160 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e   pFrom is curren
30170 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79  tly carrying any
30180 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
30190 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a  (entries in the.
301a0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c  ** MemPage.aOvfl
301b0 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20  [] array), they 
301c0 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74  are not copied t
301d0 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65  o pTo. .**.** Be
301e0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
301f0 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e  page pTo is rein
30200 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20  itialized using 
30210 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
30220 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Page()..**.** Th
30230 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  e performance of
30240 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
30250 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20  s not critical. 
30260 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
30270 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e  by .** the balan
30280 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61  ce_shallower() a
30290 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nd balance_deepe
302a0 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20  r() procedures, 
302b0 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68  neither of.** wh
302c0 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f  ich are called o
302d0 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61  ften under norma
302e0 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e  l circumstances.
302f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
30300 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d  opyNodeContent(M
30310 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d  emPage *pFrom, M
30320 65 6d 50 61 67 65 20 2a 70 54 6f 29 7b 0a 20 20  emPage *pTo){.  
30330 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74  BtShared * const
30340 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42   pBt = pFrom->pB
30350 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  t;.  u8 * const 
30360 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61  aFrom = pFrom->a
30370 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  Data;.  u8 * con
30380 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44  st aTo = pTo->aD
30390 61 74 61 3b 0a 20 20 69 6e 74 20 63 6f 6e 73 74  ata;.  int const
303a0 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f   iFromHdr = pFro
303b0 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  m->hdrOffset;.  
303c0 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72  int const iToHdr
303d0 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d   = ((pTo->pgno==
303e0 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20  1) ? 100 : 0);. 
303f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30400 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 44 61 74 61  _OK;.  int iData
30410 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72  ;..  assert( pFr
30420 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
30430 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e  assert( pFrom->n
30440 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a  Free>=iToHdr );.
30450 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
30460 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
30470 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73 61  dr+5])<=pBt->usa
30480 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a  bleSize );..  /*
30490 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
304a0 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
304b0 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
304c0 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
304d0 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65  iData = get2byte
304e0 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
304f0 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  +5]);.  memcpy(&
30500 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72  aTo[iData], &aFr
30510 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e  om[iData], pBt->
30520 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61  usableSize-iData
30530 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 54 6f  );.  memcpy(&aTo
30540 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d  [iToHdr], &aFrom
30550 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f  [iFromHdr], pFro
30560 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  m->cellOffset + 
30570 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b  2*pFrom->nCell);
30580 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c  ..  /* Reinitial
30590 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20  ize page pTo so 
305a0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
305b0 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
305c0 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
305d0 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64 61  match the new da
305e0 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69  ta. The initiali
305f0 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 22 63  zation of pTo "c
30600 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20 61 73 20  annot" fail, as 
30610 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 20 63 6f  the.  ** data co
30620 70 69 65 64 20 66 72 6f 6d 20 70 46 72 6f 6d 20  pied from pFrom 
30630 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76  is known to be v
30640 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 70 54 6f 2d  alid.  */.  pTo-
30650 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 54  >isInit = 0;.  T
30660 45 53 54 4f 4e 4c 59 28 72 63 20 3d 20 29 20 73  ESTONLY(rc = ) s
30670 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
30680 61 67 65 28 70 54 6f 29 3b 0a 20 20 61 73 73 65  age(pTo);.  asse
30690 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
306a0 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
306b0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
306c0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
306d0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
306e0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r-map entries.  
306f0 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
30700 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
30710 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
30720 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
30730 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f 0a 20 20  inters to. */.  
30740 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
30750 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
30760 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f  ChildPtrmaps(pTo
30770 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
30780 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
30790 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
307a0 6c 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  led on the root 
307b0 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20  page of a btree 
307c0 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  when the root.**
307d0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
307e0 6f 20 63 65 6c 6c 73 2e 20 54 68 69 73 20 69 73  o cells. This is
307f0 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
30800 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65  to make the tree
30810 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79  .** shallower by
30820 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73   one level..*/.s
30830 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
30840 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50  e_shallower(MemP
30850 61 67 65 20 2a 70 52 6f 6f 74 29 7b 0a 20 20 2f  age *pRoot){.  /
30860 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
30870 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61 73  is empty but has
30880 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61   one child.  Tra
30890 6e 73 66 65 72 20 74 68 65 0a 20 20 2a 2a 20 69  nsfer the.  ** i
308a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
308b0 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69  that one child i
308c0 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67  nto the root pag
308d0 65 20 69 66 20 69 74 20 0a 20 20 2a 2a 20 77 69  e if it .  ** wi
308e0 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65  ll fit.  This re
308f0 64 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20  duces the depth 
30900 6f 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f  of the tree by o
30910 6e 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ne..  **.  ** If
30920 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
30930 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73  s page 1, it has
30940 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69   less space avai
30950 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 2a 2a 20  lable than.  ** 
30960 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
30970 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
30980 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
30990 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
309a0 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64  ng.  ** of the d
309b0 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f  atabase fle), so
309c0 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65   it might not be
309d0 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c   able to hold al
309e0 6c 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 69  l of the .  ** i
309f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65  nformation curre
30a00 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69  ntly contained i
30a10 6e 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66  n the child.  If
30a20 20 74 68 69 73 20 69 73 20 74 68 65 20 0a 20 20   this is the .  
30a30 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f  ** case, then do
30a40 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e   not do the tran
30a50 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67  sfer.  Leave pag
30a60 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70 74  e 1 empty except
30a70 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69  .  ** for the ri
30a80 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74  ght-pointer to t
30a90 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  he child page.  
30aa0 54 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62  The child page b
30ab0 65 63 6f 6d 65 73 0a 20 20 2a 2a 20 74 68 65 20  ecomes.  ** the 
30ac0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20  virtual root of 
30ad0 74 68 65 20 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  the tree..  */. 
30ae0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30af0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
30b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
30b10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
30b20 69 6e 74 20 63 6f 6e 73 74 20 68 64 72 20 3d 20  int const hdr = 
30b30 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
30b40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
30b50 66 73 65 74 20 6f 66 20 72 6f 6f 74 20 70 61 67  fset of root pag
30b60 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 4d 65  e header */.  Me
30b70 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
30b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
30ba0 20 63 68 69 6c 64 20 6f 66 20 70 52 6f 6f 74 20   child of pRoot 
30bb0 2a 2f 0a 20 20 50 67 6e 6f 20 63 6f 6e 73 74 20  */.  Pgno const 
30bc0 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34  pgnoChild = get4
30bd0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
30be0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
30bf0 73 65 74 2b 38 5d 29 3b 0a 20 20 0a 20 20 61 73  set+8]);.  .  as
30c00 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 43 65  sert( pRoot->nCe
30c10 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
30c20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
30c30 5f 68 65 6c 64 28 70 52 6f 6f 74 2d 3e 70 42 74  _held(pRoot->pBt
30c40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
30c50 73 65 72 74 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  sert( !pRoot->le
30c60 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  af );.  assert( 
30c70 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20  pgnoChild>0 );. 
30c80 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
30c90 6c 64 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  ld<=pagerPagecou
30ca0 6e 74 28 70 52 6f 6f 74 2d 3e 70 42 74 29 20 29  nt(pRoot->pBt) )
30cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 68 64 72 3d  ;.  assert( hdr=
30cc0 3d 30 20 7c 7c 20 70 52 6f 6f 74 2d 3e 70 67 6e  =0 || pRoot->pgn
30cd0 6f 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 72 63 20  o==1 );.  .  rc 
30ce0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
30cf0 74 50 61 67 65 28 70 52 6f 6f 74 2d 3e 70 42 74  tPage(pRoot->pBt
30d00 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43  , pgnoChild, &pC
30d10 68 69 6c 64 2c 20 30 29 3b 0a 20 20 69 66 28 20  hild, 0);.  if( 
30d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30d30 0a 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d  .    if( pChild-
30d40 3e 6e 46 72 65 65 3e 3d 68 64 72 20 29 7b 0a 20  >nFree>=hdr ){. 
30d50 20 20 20 20 20 69 66 28 20 68 64 72 20 29 7b 0a       if( hdr ){.
30d60 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 65 66          rc = def
30d70 72 61 67 6d 65 6e 74 50 61 67 65 28 70 43 68 69  ragmentPage(pChi
30d80 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ld);.      }.   
30d90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30db0 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  rc = copyNodeCon
30dc0 74 65 6e 74 28 70 43 68 69 6c 64 2c 20 70 52 6f  tent(pChild, pRo
30dd0 6f 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ot);.      }.   
30de0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30df0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30e00 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 43  rc = freePage(pC
30e10 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  hild);.      }. 
30e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30e30 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61 73  /* The child has
30e40 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
30e50 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20  n that will fit 
30e60 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20  on the root..   
30e70 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69     ** The tree i
30e80 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63  s already balanc
30e90 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e  ed.  Do nothing.
30ea0 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28   */.      TRACE(
30eb0 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
30ec0 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74   %d will not fit
30ed0 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70   on page 1\n", p
30ee0 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Child->pgno));. 
30ef0 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
30f00 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
30f10 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
30f20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
30f30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
30f40 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20  d when the root 
30f50 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
30f60 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a   structure is.**
30f70 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f   overfull (has o
30f80 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
30f90 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a  low pages)..**.*
30fa0 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61  * A new child pa
30fb0 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ge is allocated 
30fc0 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
30fd0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
30fe0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e  root.** page, in
30ff0 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77  cluding overflow
31000 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69   cells, are copi
31010 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c  ed into the chil
31020 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  d. The root.** p
31030 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72  age is then over
31040 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20  written to make 
31050 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  it an empty page
31060 20 77 69 74 68 20 74 68 65 20 72 69 67 68 74 2d   with the right-
31070 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65  child .** pointe
31080 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
31090 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a  e new page..**.*
310a0 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
310b0 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d  ng, all pointer-
310c0 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72  map entries corr
310d0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
310e0 65 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  es .** that the 
310f0 6e 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e  new child-page n
31100 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  ow contains poin
31110 74 65 72 73 20 74 6f 20 61 72 65 20 75 70 64 61  ters to are upda
31120 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72  ted. The.** entr
31130 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  y corresponding 
31140 74 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68 74  to the new right
31150 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
31160 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  f the root.** pa
31170 67 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74  ge is also updat
31180 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
31190 63 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c  cessful, *ppChil
311a0 64 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74  d is set to cont
311b0 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
311c0 74 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a  to the child .**
311d0 20 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45   page and SQLITE
311e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
311f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
31200 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75  e caller is requ
31210 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20  ired.** to call 
31220 72 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e  releasePage() on
31230 20 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c   *ppChild exactl
31240 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72  y once. If an er
31250 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61  ror occurs,.** a
31260 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
31270 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
31280 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20  Child is set to 
31290 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
312a0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
312b0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20  MemPage *pRoot, 
312c0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c  MemPage **ppChil
312d0 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  d){.  int rc;   
312e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
31300 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  alue from subpro
31310 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d  cedures */.  Mem
31320 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30  Page *pChild = 0
31330 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
31340 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
31350 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
31360 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
31370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31380 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
31390 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
313a0 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
313b0 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e  d *pBt = pRoot->
313c0 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42  pBt;    /* The B
313d0 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  Tree */..  asser
313e0 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66  t( pRoot->nOverf
313f0 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  low>0 );.  asser
31400 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
31410 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
31420 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ) );..  /* Make 
31430 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20  pRoot, the root 
31440 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
31450 65 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c  ee, writable. Al
31460 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20  locate a new .  
31470 2a 2a 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ** page that wil
31480 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
31490 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
314a0 70 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20  pPage. Copy the 
314b0 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  contents.  ** of
314c0 20 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64   the node stored
314d0 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74   on pRoot into t
314e0 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
314f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  e..  */.  if( SQ
31500 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
31510 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31520 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
31530 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
31540 4b 21 3d 28 72 63 20 3d 20 61 6c 6c 6f 63 61 74  K!=(rc = allocat
31550 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 26  eBtreePage(pBt,&
31560 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c  pChild,&pgnoChil
31570 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29  d,pRoot->pgno,0)
31580 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
31590 4b 21 3d 28 72 63 20 3d 20 63 6f 70 79 4e 6f 64  K!=(rc = copyNod
315a0 65 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20  eContent(pRoot, 
315b0 70 43 68 69 6c 64 29 29 0a 20 20 20 7c 7c 20 28  pChild)).   || (
315c0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20  ISAUTOVACUUM && 
315d0 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .       SQLITE_O
315e0 4b 21 3d 28 72 63 20 3d 20 70 74 72 6d 61 70 50  K!=(rc = ptrmapP
315f0 75 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c  ut(pBt, pgnoChil
31600 64 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  d, PTRMAP_BTREE,
31610 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 29 29 29 0a   pRoot->pgno))).
31620 20 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c    ){.    *ppChil
31630 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  d = 0;.    relea
31640 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
31650 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
31660 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
31670 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
31680 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62  able(pChild->pDb
31690 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
316a0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
316b0 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
316c0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
316d0 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
316e0 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43  nCell==pRoot->nC
316f0 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28  ell );..  TRACE(
31700 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
31710 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
31720 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c  n", pRoot->pgno,
31730 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
31740 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20  ..  /* Copy the 
31750 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66  overflow cells f
31760 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68  rom pRoot to pCh
31770 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ild */.  memcpy(
31780 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70  pChild->aOvfl, p
31790 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f  Root->aOvfl, pRo
317a0 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69  ot->nOverflow*si
317b0 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66  zeof(pRoot->aOvf
317c0 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64  l[0]));.  pChild
317d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52  ->nOverflow = pR
317e0 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  oot->nOverflow;.
317f0 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63  .  /* Zero the c
31800 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74  ontents of pRoot
31810 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70  . Then install p
31820 43 68 69 6c 64 20 61 73 20 74 68 65 20 72 69 67  Child as the rig
31830 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a  ht-child. */.  z
31840 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 70  eroPage(pRoot, p
31850 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20  Child->aData[0] 
31860 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  & ~PTF_LEAF);.  
31870 70 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  put4byte(&pRoot-
31880 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
31890 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
318a0 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68  Child);..  *ppCh
318b0 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20  ild = pChild;.  
318c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
318d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
318e0 61 67 65 20 74 68 61 74 20 70 43 75 72 20 63 75  age that pCur cu
318f0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
31900 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  o has just been 
31910 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73  modified in.** s
31920 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66 75  ome way. This fu
31930 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f  nction figures o
31940 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66  ut if this modif
31950 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  ication means th
31960 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20  e.** tree needs 
31970 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20  to be balanced, 
31980 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20  and if so calls 
31990 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
319a0 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f  balancing .** ro
319b0 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67  utine. Balancing
319c0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a   routines are:.*
319d0 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71  *.**   balance_q
319e0 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61  uick().**   bala
319f0 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 0a  nce_shallower().
31a00 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65  **   balance_dee
31a10 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e  per().**   balan
31a20 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2a 0a  ce_nonroot().**.
31a30 2a 2a 20 49 66 20 62 75 69 6c 74 20 77 69 74 68  ** If built with
31a40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 2c 20 70   SQLITE_DEBUG, p
31a50 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
31a60 65 64 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ed is set to tru
31a70 65 20 69 66 20 0a 2a 2a 20 62 61 6c 61 6e 63 65  e if .** balance
31a80 5f 73 68 61 6c 6c 6f 77 65 72 28 29 2c 20 62 61  _shallower(), ba
31a90 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6f  lance_deeper() o
31aa0 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  r balance_nonroo
31ab0 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  t() is called..*
31ac0 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
31ad0 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  se functions are
31ae0 20 69 6e 76 6f 6b 65 64 2c 20 70 43 75 72 2d 3e   invoked, pCur->
31af0 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 69 73  pagesShuffled is
31b00 20 6c 65 66 74 0a 2a 2a 20 75 6e 6d 6f 64 69 66   left.** unmodif
31b10 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
31b20 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72  nt balance(BtCur
31b30 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
31b40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
31b50 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d  ;.  const int nM
31b60 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e  in = pCur->pBt->
31b70 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f  usableSize * 2 /
31b80 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63   3;.  u8 aBalanc
31b90 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b  eQuickSpace[13];
31ba0 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30  .  u8 *pFree = 0
31bb0 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  ;..  TESTONLY( i
31bc0 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
31bd0 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20  _called = 0 );. 
31be0 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62   TESTONLY( int b
31bf0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61  alance_deeper_ca
31c00 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64  lled = 0 );..  d
31c10 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  o {.    int iPag
31c20 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
31c30 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
31c40 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
31c50 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20  ge[iPage];..    
31c60 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a  if( iPage==0 ){.
31c70 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
31c80 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
31c90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f        /* The roo
31ca0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
31cb0 74 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  tree is overfull
31cc0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63  . In this case c
31cd0 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20  all the.        
31ce0 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ** balance_deepe
31cf0 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
31d00 63 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69  create a new chi
31d10 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ld for the root-
31d20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
31d30 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75 72  and copy the cur
31d40 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
31d50 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
31d60 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20  o it. The.      
31d70 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74    ** next iterat
31d80 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
31d90 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
31da0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  the child page..
31db0 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
31dc0 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c      assert( (bal
31dd0 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
31de0 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
31df0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
31e00 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c 20 26  _deeper(pPage, &
31e10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29  pCur->apPage[1])
31e20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31e40 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
31e50 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
31e60 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
31e70 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
31e80 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d    pCur->aiIdx[1]
31e90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31ea0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
31eb0 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c  Page[1]->nOverfl
31ec0 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow );.        }.
31ed0 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59          VVA_ONLY
31ee0 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75  ( pCur->pagesShu
31ef0 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 20  ffled = 1 );.   
31f00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31f10 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
31f20 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
31f30 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 49   is now empty. I
31f40 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  f the root-page 
31f50 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
31f60 2a 20 61 6c 73 6f 20 61 20 6c 65 61 66 20 70 61  * also a leaf pa
31f70 67 65 2c 20 69 74 20 77 69 6c 6c 20 68 61 76 65  ge, it will have
31f80 20 61 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20   a single child 
31f90 70 61 67 65 2e 20 43 61 6c 6c 20 0a 20 20 20 20  page. Call .    
31fa0 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 73      ** balance_s
31fb0 68 61 6c 6c 6f 77 65 72 20 74 6f 20 61 74 74 65  hallower to atte
31fc0 6d 70 74 20 74 6f 20 63 6f 70 79 20 74 68 65 20  mpt to copy the 
31fd0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
31fe0 73 69 6e 67 6c 65 0a 20 20 20 20 20 20 20 20 2a  single.        *
31ff0 2a 20 63 68 69 6c 64 2d 70 61 67 65 20 69 6e 74  * child-page int
32000 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
32010 28 74 68 69 73 20 6d 61 79 20 6e 6f 74 20 62 65  (this may not be
32020 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65   possible if the
32030 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6f 74  .        ** root
32040 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 29   page is page 1)
32050 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
32060 20 20 20 20 20 2a 2a 20 57 68 65 74 68 65 72 20       ** Whether 
32070 6f 72 20 6e 6f 74 20 74 68 69 73 20 69 73 20 70  or not this is p
32080 6f 73 73 69 62 6c 65 20 2c 20 74 68 65 20 74 72  ossible , the tr
32090 65 65 20 69 73 20 6e 6f 77 20 62 61 6c 61 6e 63  ee is now balanc
320a0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
320b0 54 68 65 72 65 66 6f 72 65 20 69 73 20 6e 6f 20  Therefore is no 
320c0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
320d0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 2e 0a 20  f the do-loop.. 
320e0 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20         */ .     
320f0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43     if( pPage->nC
32100 65 6c 6c 3d 3d 30 20 26 26 20 21 70 50 61 67 65  ell==0 && !pPage
32110 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
32120 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
32130 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65  _shallower(pPage
32140 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 56 41  );.          VVA
32150 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67  _ONLY( pCur->pag
32160 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29  esShuffled = 1 )
32170 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32180 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
32190 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
321a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
321b0 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e  w==0 && pPage->n
321c0 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20  Free<=nMin ){.  
321d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
321e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50  else{.      MemP
321f0 61 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61 72  age * const pPar
32200 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  ent = pCur->apPa
32210 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20  ge[iPage-1];.   
32220 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49 64     int const iId
32230 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
32240 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20  iPage-1];..     
32250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32260 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d  erWrite(pParent-
32270 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
32280 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32290 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  OK ){.#ifndef SQ
322a0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
322b0 41 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20 69  ALANCE.        i
322c0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
322d0 61 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  a.         && pP
322e0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
322f0 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  1.         && pP
32300 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  age->aOvfl[0].id
32310 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a  x==pPage->nCell.
32320 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72           && pPar
32330 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20  ent->pgno!=1.   
32340 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74        && pParent
32350 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20  ->nCell==iIdx.  
32360 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
32370 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e     /* Call balan
32380 63 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 72  ce_quick() to cr
32390 65 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c 69  eate a new sibli
323a0 6e 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 77  ng of pPage on w
323b0 68 69 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a  hich.          *
323c0 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6f  * to store the o
323d0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61  verflow cell. ba
323e0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 6e  lance_quick() in
323f0 73 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c 6c  serts a new cell
32400 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
32410 74 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63  to pParent, whic
32420 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72  h may cause pPar
32430 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66  ent overflow. If
32440 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
32450 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20  ** happens, the 
32460 6e 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e 20  next interation 
32470 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
32480 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61 72  ill balance pPar
32490 65 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ent .          *
324a0 2a 20 75 73 65 20 65 69 74 68 65 72 20 62 61 6c  * use either bal
324b0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f  ance_nonroot() o
324c0 72 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  r balance_deeper
324d0 28 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a 20  (). Until this. 
324e0 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70           ** happ
324f0 65 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f  ens, the overflo
32500 77 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65 64  w cell is stored
32510 20 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63 65   in the aBalance
32520 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20  QuickSpace[].   
32530 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
32540 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  . .          **.
32550 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65            ** The
32560 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20   purpose of the 
32570 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
32580 28 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20 74  () is to check t
32590 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20  hat only a.     
325a0 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63       ** single c
325b0 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71  all to balance_q
325c0 75 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20 66  uick() is made f
325d0 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  or each call to 
325e0 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
325f0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  * function. If t
32600 68 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65 72  his were not ver
32610 69 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65 20  ified, a subtle 
32620 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65  bug involving re
32630 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  use.          **
32640 20 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63 65   of the aBalance
32650 51 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67  QuickSpace[] mig
32660 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20  ht sneak in..   
32670 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32680 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c      assert( (bal
32690 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65  ance_quick_calle
326a0 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  d++)==0 );.     
326b0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
326c0 65 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c  e_quick(pParent,
326d0 20 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65   pPage, aBalance
326e0 51 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20 20  QuickSpace);.   
326f0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
32700 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
32710 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
32720 20 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61   case, call bala
32730 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f  nce_nonroot() to
32740 20 72 65 64 69 73 74 72 69 62 75 74 65 20 63 65   redistribute ce
32750 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  lls.          **
32760 20 62 65 74 77 65 65 6e 20 70 50 61 67 65 20 61   between pPage a
32770 6e 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69 74  nd up to 2 of it
32780 73 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 2e  s sibling pages.
32790 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20   This involves. 
327a0 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69           ** modi
327b0 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
327c0 74 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20 77  ts of pParent, w
327d0 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70  hich may cause p
327e0 50 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20  Parent to.      
327f0 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76      ** become ov
32800 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
32810 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69 74  ull. The next it
32820 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
32830 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20  o-loop.         
32840 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65   ** will balance
32850 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
32860 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69 73   to correct this
32870 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a  ..          ** .
32880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
32890 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
328a0 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c  becomes overfull
328b0 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  , the overflow c
328c0 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20  ell or cells.   
328d0 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73 74         ** are st
328e0 6f 72 65 64 20 69 6e 20 74 68 65 20 70 53 70 61  ored in the pSpa
328f0 63 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61  ce buffer alloca
32900 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ted immediately 
32910 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20 20  below. .        
32920 20 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65 6e    ** A subsequen
32930 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
32940 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20  he do-loop will 
32950 64 65 61 6c 20 77 69 74 68 20 74 68 69 73 20 62  deal with this b
32960 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  y.          ** c
32970 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e  alling balance_n
32980 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63  onroot() (balanc
32990 65 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20 62  e_deeper() may b
329a0 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a  e called first,.
329b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74            ** but
329c0 20 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61 6c   it doesn't deal
329d0 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 63   with overflow c
329e0 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65  ells - just move
329f0 73 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20 20  s them to a.    
32a00 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65        ** differe
32a10 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74  nt page). Once t
32a20 68 69 73 20 73 75 62 73 65 71 75 65 6e 74 20 63  his subsequent c
32a30 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e  all to balance_n
32a40 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20 20  onroot() .      
32a50 20 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c      ** has compl
32a60 65 74 65 64 2c 20 69 74 20 69 73 20 73 61 66 65  eted, it is safe
32a70 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
32a80 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73  pSpace buffer us
32a90 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 20 20  ed by.          
32aa0 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
32ab0 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65  call, as the ove
32ac0 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20  rflow cell data 
32ad0 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0a  will have been .
32ae0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70            ** cop
32af0 69 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ied either into 
32b00 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64 61  the body of a da
32b10 74 61 62 61 73 65 20 70 61 67 65 20 6f 72 20 69  tabase page or i
32b20 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
32b30 20 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65 20        ** pSpace 
32b40 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f  buffer passed to
32b50 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c 6c   the latter call
32b60 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   to balance_nonr
32b70 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20 20  oot()..         
32b80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
32b90 20 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74   *pSpace = sqlit
32ba0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75  e3PageMalloc(pCu
32bb0 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  r->pBt->pageSize
32bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
32bd0 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
32be0 74 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 2c  t(pParent, iIdx,
32bf0 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20   pSpace);.      
32c00 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b      if( pFree ){
32c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
32c20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20  If pFree is not 
32c30 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20  NULL, it points 
32c40 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75  to the pSpace bu
32c50 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20  ffer used .     
32c60 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70         ** by a p
32c70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
32c80 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
32c90 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20  ). Its contents 
32ca0 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  are.            
32cb0 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69  ** now stored ei
32cc0 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74  ther on real dat
32cd0 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77  abase pages or w
32ce0 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20  ithin the .     
32cf0 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53         ** new pS
32d00 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20  pace buffer, so 
32d10 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79  it may be safely
32d20 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a   freed here. */.
32d30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32d40 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65  te3PageFree(pFre
32d50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
32d60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
32d70 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
32d80 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66  will be freed af
32d90 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c  ter the next cal
32da0 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  l to.          *
32db0 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  * balance_nonroo
32dc0 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66  t(), or just bef
32dd0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
32de0 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68  n returns, which
32df0 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ever.          *
32e00 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a  * comes first. *
32e10 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 65  /.          pFre
32e20 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20  e = pSpace;.    
32e30 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
32e40 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66  pCur->pagesShuff
32e50 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 20 20 20  led = 1 );.     
32e60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
32e70 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
32e80 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20  flow = 0;..     
32e90 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65   /* The next ite
32ea0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
32eb0 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74  -loop balances t
32ec0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
32ed0 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
32ee0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
32ef0 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d     pCur->iPage--
32f00 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
32f10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32f20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20  );..  if( pFree 
32f30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
32f40 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  geFree(pFree);. 
32f50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
32f60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
32f70 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c  utine checks all
32f80 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f   cursors that po
32f90 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e  int to table pgn
32fa0 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79  oRoot..** If any
32fb0 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72   of those cursor
32fc0 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69  s were opened wi
32fd0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20  th wrFlag==0 in 
32fe0 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64  a different.** d
32ff0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
33000 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20 63  on (a database c
33010 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73  onnection that s
33020 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72 0a  hares the pager.
33030 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74 68  ** cache with th
33040 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63  e current connec
33050 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f  tion) and that o
33060 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
33070 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  .** is not in th
33080 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74  e ReadUncommmitt
33090 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ed state, then t
330a0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
330b0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  rns .** SQLITE_L
330c0 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20  OCKED..**.** As 
330d0 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73 20  well as cursors 
330e0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20  with wrFlag==0, 
330f0 63 75 72 73 6f 72 73 20 77 69 74 68 20 0a 2a 2a  cursors with .**
33100 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
33110 65 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f  e==1 are also co
33120 6e 73 69 64 65 72 65 64 20 27 72 65 61 64 27 20  nsidered 'read' 
33130 63 75 72 73 6f 72 73 20 62 65 63 61 75 73 65 0a  cursors because.
33140 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  ** incremental b
33150 6c 6f 62 20 63 75 72 73 6f 72 73 20 61 72 65 20  lob cursors are 
33160 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65  used for both re
33170 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e  ading and writin
33180 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67  g..**.** When pg
33190 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f  noRoot is the ro
331a0 6f 74 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e  ot page of an in
331b0 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73  tkey table, this
331c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73   function is als
331d0 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65  o.** responsible
331e0 20 66 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e   for invalidatin
331f0 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  g incremental bl
33200 6f 62 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20  ob cursors when 
33210 74 68 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a  the table row.**
33220 20 6f 6e 20 77 68 69 63 68 20 74 68 65 79 20 61   on which they a
33230 72 65 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c  re opened is del
33240 65 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64  eted or modified
33250 2e 20 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e  . Cursors are in
33260 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63  validated.** acc
33270 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f  ording to the fo
33280 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  llowing rules:.*
33290 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42  *.**   1) When B
332a0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
332b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
332c0 6d 70 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20  mpletely delete 
332d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
332e0 20 20 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65       of a B-Tree
332f0 20 74 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65   table, pExclude
33300 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20   is set to zero 
33310 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52  and parameter iR
33320 6f 77 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73  ow is .**      s
33330 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  et to non-zero. 
33340 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
33350 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
33360 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a  b cursors open.*
33370 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61  *      on the ta
33380 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67  ble rooted at pg
33390 6e 6f 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c  noRoot are inval
333a0 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  idated..**.**   
333b0 32 29 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73  2) When BtreeIns
333c0 65 72 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65  ert(), BtreeDele
333d0 74 65 28 29 20 6f 72 20 42 74 72 65 65 50 75 74  te() or BtreePut
333e0 44 61 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64  Data() is called
333f0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64   to .**      mod
33400 69 66 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20  ify a table row 
33410 76 69 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65  via an SQL state
33420 6d 65 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69  ment, pExclude i
33430 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
33440 20 20 20 20 20 20 77 72 69 74 65 20 63 75 72 73        write curs
33450 6f 72 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68  or used to do th
33460 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61  e modification a
33470 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f  nd parameter iRo
33480 77 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20  w is set.**     
33490 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20   to the integer 
334a0 72 6f 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d  row id of the B-
334b0 54 72 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67  Tree entry being
334c0 20 6d 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73   modified. Unles
334d0 73 0a 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75  s.**      pExclu
334e0 64 65 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20  de is itself an 
334f0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
33500 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c   cursor, then al
33510 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a  l incremental.**
33520 20 20 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f        blob curso
33530 72 73 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69  rs open on row i
33540 52 6f 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65  Row of the B-Tre
33550 65 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  e are invalidate
33560 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66  d..**.**   3) If
33570 20 62 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61   both pExclude a
33580 6e 64 20 69 52 6f 77 20 61 72 65 20 73 65 74 20  nd iRow are set 
33590 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72  to zero, no incr
335a0 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a  emental blob .**
335b0 20 20 20 20 20 20 63 75 72 73 6f 72 73 20 61 72        cursors ar
335c0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
335d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
335e0 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63  ckForReadConflic
335f0 74 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ts(.  Btree *pBt
33600 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
33610 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
33620 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
33630 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20   Pgno pgnoRoot, 
33640 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b           /* Look
33650 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
33660 73 20 6f 6e 20 74 68 69 73 20 62 74 72 65 65 20  s on this btree 
33670 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
33680 45 78 63 6c 75 64 65 2c 20 20 20 20 20 2f 2a 20  Exclude,     /* 
33690 49 67 6e 6f 72 65 20 74 68 69 73 20 63 75 72 73  Ignore this curs
336a0 6f 72 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  or */.  i64 iRow
336b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336c0 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68 61  /* The rowid tha
336d0 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67  t might be chang
336e0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ing */.){.  BtCu
336f0 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
33700 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
33710 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  e->pBt;.  sqlite
33720 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e  3 *db = pBtree->
33730 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
33740 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
33750 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
33760 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
33770 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
33780 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d  ext){.    if( p=
33790 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74  =pExclude ) cont
337a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
337b0 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52  >pgnoRoot!=pgnoR
337c0 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oot ) continue;.
337d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
337e0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
337f0 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c   if( p->isIncrbl
33800 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 20 0a 20  obHandle && ( . 
33810 20 20 20 20 20 20 20 20 28 21 70 45 78 63 6c 75          (!pExclu
33820 64 65 20 26 26 20 69 52 6f 77 29 0a 20 20 20 20  de && iRow).    
33830 20 20 7c 7c 20 28 70 45 78 63 6c 75 64 65 20 26    || (pExclude &
33840 26 20 21 70 45 78 63 6c 75 64 65 2d 3e 69 73 49  & !pExclude->isI
33850 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
33860 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
33870 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  Row).    )){.   
33880 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
33890 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
338a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
338b0 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43  if( p->eState!=C
338c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f  URSOR_VALID ) co
338d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
338e0 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69  p->wrFlag==0 .#i
338f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33900 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
33910 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  || p->isIncrblob
33920 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20  Handle.#endif.  
33930 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
33940 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d  e3 *dbOther = p-
33950 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
33960 20 20 20 61 73 73 65 72 74 28 64 62 4f 74 68 65     assert(dbOthe
33970 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  r);.      if( db
33980 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64 62  Other!=db && (db
33990 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53  Other->flags & S
339a0 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
339b0 69 74 74 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20  itted)==0 ){.   
339c0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e       sqlite3Conn
339d0 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 64 62  ectionBlocked(db
339e0 2c 20 64 62 4f 74 68 65 72 29 3b 0a 20 20 20 20  , dbOther);.    
339f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33a00 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
33a10 41 43 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ACHE;.      }.  
33a20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
33a30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
33a40 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
33a50 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
33a60 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65  e BTree.  The ke
33a70 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  y is given by (p
33a80 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64  Key,nKey).** and
33a90 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76   the data is giv
33aa0 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61  en by (pData,nDa
33ab0 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ta).  The cursor
33ac0 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
33ad0 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20  .** define what 
33ae0 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64  table the record
33af0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
33b00 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63  ted into.  The c
33b10 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
33b20 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
33b30 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
33b40 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54  **.** For an INT
33b50 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20  KEY table, only 
33b60 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f  the nKey value o
33b70 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65  f the key is use
33b80 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
33b90 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a  gnored.  For a Z
33ba0 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74  ERODATA table, t
33bb0 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61  he pData and nDa
33bc0 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f  ta are both igno
33bd0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
33be0 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72  e seekResult par
33bf0 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
33c00 72 6f 2c 20 74 68 65 6e 20 61 20 73 75 63 63 65  ro, then a succe
33c10 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a  ssful call to.**
33c20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
33c30 65 74 6f 28 29 20 74 6f 20 73 65 65 6b 20 63 75  eto() to seek cu
33c40 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b  rsor pCur to (pK
33c50 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c  ey, nKey) has al
33c60 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65  ready.** been pe
33c70 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73  rformed. seekRes
33c80 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72 63  ult is the searc
33c90 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65  h result returne
33ca0 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a  d (a negative.**
33cb0 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72 20   number if pCur 
33cc0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74  points at an ent
33cd0 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  ry that is small
33ce0 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e  er than (pKey, n
33cf0 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f  Key), or.** a po
33d00 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
33d10 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
33d20 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20 6c  n etry that is l
33d30 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28  arger than .** (
33d40 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a  pKey, nKey)). .*
33d50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
33d60 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
33d70 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73   is 0, then curs
33d80 6f 72 20 70 43 75 72 20 6d 61 79 20 70 6f 69 6e  or pCur may poin
33d90 74 20 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e 74  t to any .** ent
33da0 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72  ry or to no entr
33db0 79 20 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68 69  y at all. In thi
33dc0 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
33dd0 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b  tion has to seek
33de0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62  .** the cursor b
33df0 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65  efore the new ke
33e00 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65  y can be inserte
33e10 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
33e20 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20  3BtreeInsert(.  
33e30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
33e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33e50 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
33e60 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
33e70 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
33e80 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
33e90 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
33ea0 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68  /* The key of th
33eb0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
33ec0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
33ed0 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20  ata, int nData, 
33ee0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20   /* The data of 
33ef0 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
33f00 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
33f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33f30 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f  extra 0 bytes to
33f40 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20   append to data 
33f50 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42  */.  int appendB
33f60 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ias,            
33f70 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
33f80 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e  his is likely an
33f90 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74   append */.  int
33fa0 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20   seekResult     
33fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
33fc0 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 73  esult of prior s
33fd0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
33fe0 6f 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20  o() call */.){. 
33ff0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
34000 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b  oc = seekResult;
34010 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20  .  int szNew;.  
34020 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
34030 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
34040 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
34050 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
34060 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
34070 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
34080 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
34090 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
340a0 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ll = 0;..  asser
340b0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
340c0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
340d0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
340e0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
340f0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
34100 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
34110 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ly );.  assert( 
34120 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a  pCur->wrFlag );.
34130 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52    rc = checkForR
34140 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 43 75  eadConflicts(pCu
34150 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d  r->pBtree, pCur-
34160 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c  >pgnoRoot, pCur,
34170 20 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20 72 63   nKey);.  if( rc
34180 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
34190 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  .    /* The tabl
341a0 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
341b0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
341c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
341d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
341e0 44 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 3b  D_SHAREDCACHE );
341f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
34200 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
34210 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
34220 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
34230 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
34240 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
34250 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
34260 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
34270 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
34280 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
34290 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
342a0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
342b0 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62  3BtreeMoveto() b
342c0 65 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  elow is a no-op.
342d0 20 46 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c   For.  ** exampl
342e0 65 2c 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e  e, when insertin
342f0 67 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61  g data into a ta
34300 62 6c 65 20 77 69 74 68 20 61 75 74 6f 2d 67 65  ble with auto-ge
34310 6e 65 72 61 74 65 64 20 69 6e 74 65 67 65 72 0a  nerated integer.
34320 20 20 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20 56    ** keys, the V
34330 44 42 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65  DBE layer invoke
34340 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  s sqlite3BtreeLa
34350 73 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f  st() to figure o
34360 75 74 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74  ut the .  ** int
34370 65 67 65 72 20 6b 65 79 20 74 6f 20 75 73 65 2e  eger key to use.
34380 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
34390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
343a0 61 63 74 75 61 6c 6c 79 20 69 6e 73 65 72 74 20  actually insert 
343b0 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 20 69  the .  ** data i
343c0 6e 74 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42  nto the intkey B
343d0 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63  -Tree. In this c
343e0 61 73 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  ase sqlite3Btree
343f0 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67 6e 69  Moveto() recogni
34400 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  zes.  ** that th
34410 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
34420 61 64 79 20 77 68 65 72 65 20 69 74 20 6e 65 65  ady where it nee
34430 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72 65 74  ds to be and ret
34440 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20 20 2a  urns without.  *
34450 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  * doing any work
34460 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77 61 72  . To avoid thwar
34470 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74 69 6d  ting these optim
34480 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69 73 20  izations, it is 
34490 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e  important.  ** n
344a0 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  ot to clear the 
344b0 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a  cursor here..  *
344c0 2f 0a 20 20 69 66 28 0a 20 20 20 20 53 51 4c 49  /.  if(.    SQLI
344d0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
344e0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
344f0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
34500 20 70 43 75 72 29 29 20 7c 7c 20 28 21 6c 6f 63   pCur)) || (!loc
34510 20 26 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f   &&.    SQLITE_O
34520 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
34530 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
34540 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70  , pKey, nKey, ap
34550 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29  pendBias, &loc))
34560 0a 20 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72  .  )){.    retur
34570 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
34580 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
34590 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
345a0 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  | (pCur->eState=
345b0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
345c0 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50  && loc) );..  pP
345d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
345e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
345f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34600 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79  ->intKey || nKey
34610 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
34620 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20   pPage->leaf || 
34630 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
34640 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45  ;.  TRACE(("INSE
34650 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65  RT: table=%d nke
34660 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20  y=%lld ndata=%d 
34670 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  page=%d %s\n",. 
34680 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
34690 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e  gnoRoot, nKey, n
346a0 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Data, pPage->pgn
346b0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63  o,.          loc
346c0 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65  ==0 ? "overwrite
346d0 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29  " : "new entry")
346e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
346f0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
34700 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
34710 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c  e(pBt);.  newCel
34720 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  l = pBt->pTmpSpa
34730 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c  ce;.  if( newCel
34740 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
34750 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63  LITE_NOMEM;.  rc
34760 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
34770 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b  age, newCell, pK
34780 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c  ey, nKey, pData,
34790 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26   nData, nZero, &
347a0 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63  szNew);.  if( rc
347b0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
347c0 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  rt;.  assert( sz
347d0 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72  New==cellSizePtr
347e0 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29  (pPage, newCell)
347f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
34800 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a  New<=MX_CELL_SIZ
34810 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20  E(pBt) );.  idx 
34820 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
34830 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66  ur->iPage];.  if
34840 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20  ( loc==0 ){.    
34850 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61  u16 szOld;.    a
34860 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 67 65  ssert( idx<pPage
34870 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
34880 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
34890 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
348a0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
348b0 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  c ){.      goto 
348c0 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
348d0 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20  }.    oldCell = 
348e0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
348f0 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70  idx);.    if( !p
34900 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
34910 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65      memcpy(newCe
34920 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b  ll, oldCell, 4);
34930 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64  .    }.    szOld
34940 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
34950 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
34960 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
34970 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  ll(pPage, oldCel
34980 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
34990 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
349a0 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43  ;.    rc = dropC
349b0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
349c0 73 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20  szOld);.    if( 
349d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
349e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
349f0 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
34a00 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30   }else if( loc<0
34a10 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
34a20 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
34a30 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
34a40 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  .    idx = ++pCu
34a50 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
34a60 50 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page];.  }else{.
34a70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
34a80 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20  e->leaf );.  }. 
34a90 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
34aa0 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77  (pPage, idx, new
34ab0 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20  Cell, szNew, 0, 
34ac0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
34ad0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
34ae0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
34af0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
34b00 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  w>0 );..  /* If 
34b10 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  no error has occ
34b20 75 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68  ured and pPage h
34b30 61 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  as an overflow c
34b40 65 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  ell, call balanc
34b50 65 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64  e() .  ** to red
34b60 69 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65  istribute the ce
34b70 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  lls within the t
34b80 72 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e  ree. Since balan
34b90 63 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20  ce() may move.  
34ba0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a  ** the cursor, z
34bb0 65 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72  ero the BtCursor
34bc0 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20  .info.nSize and 
34bd0 42 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b  BtCursor.validNK
34be0 65 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ey.  ** variable
34bf0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65  s..  **.  ** Pre
34c00 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
34c10 66 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20  f SQLite called 
34c20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20  moveToRoot() to 
34c30 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a  move the cursor.
34c40 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65    ** back to the
34c50 20 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61   root page as ba
34c60 6c 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20  lance() used to 
34c70 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
34c80 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  ontents.  ** of 
34c90 42 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b  BtCursor.apPage[
34ca0 5d 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61  ] and BtCursor.a
34cb0 69 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20  iIdx[]. Instead 
34cc0 6f 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20  of doing that,. 
34cd0 20 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73   ** set the curs
34ce0 6f 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76  or state to "inv
34cf0 61 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65  alid". This make
34d00 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20  s common insert 
34d10 6f 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  operations.  ** 
34d20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e  slightly faster.
34d30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65  .  **.  ** There
34d40 20 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74   is a subtle but
34d50 20 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d   important optim
34d60 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f  ization here too
34d70 2e 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  . When inserting
34d80 0a 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72  .  ** multiple r
34d90 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69  ecords into an i
34da0 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69  ntkey b-tree usi
34db0 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73  ng a single curs
34dc0 6f 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20  or (as can.  ** 
34dd0 68 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f  happen while pro
34de0 63 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45  cessing an "INSE
34df0 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45  RT INTO ... SELE
34e00 43 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20  CT" statement), 
34e10 69 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e  it.  ** is advan
34e20 74 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65  tageous to leave
34e30 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
34e40 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
34e50 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74   entry in.  ** t
34e60 68 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73  he b-tree if pos
34e70 73 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75  sible. If the cu
34e80 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
34e90 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
34ea0 74 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20  t.  ** entry in 
34eb0 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74  the table, and t
34ec0 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65  he next row inse
34ed0 72 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65  rted has an inte
34ee0 67 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72  ger key.  ** lar
34ef0 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
34f00 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65  gest existing ke
34f10 79 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  y, it is possibl
34f20 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a  e to insert the.
34f30 20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74    ** row without
34f40 20 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72   seeking the cur
34f50 73 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65  sor. This can be
34f60 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
34f70 63 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20  ce boost..  */. 
34f80 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
34f90 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
34fa0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
34fb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34fc0 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65  K && pPage->nOve
34fd0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20  rflow ){.    rc 
34fe0 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b  = balance(pCur);
34ff0 0a 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61  ..    /* Must ma
35000 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f  ke sure nOverflo
35010 77 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65  w is reset to ze
35020 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62  ro even if the b
35030 61 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20  alance().    ** 
35040 66 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20  fails. Internal 
35050 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
35060 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72  orruption will r
35070 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e  esult otherwise.
35080 20 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73   .    ** Also, s
35090 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
350a0 61 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20  ate to invalid. 
350b0 54 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43  This stops saveC
350c0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a  ursorPosition().
350d0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
350e0 6e 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63  ng to save the c
350f0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
35100 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
35110 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  */.    pCur->apP
35120 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
35130 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
35140 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
35150 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
35160 49 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ID;.  }.  assert
35170 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
35180 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
35190 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e  erflow==0 );..en
351a0 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75  d_insert:.  retu
351b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
351c0 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
351d0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
351e0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
351f0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
35200 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
35210 20 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20   at a arbitrary 
35220 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  location..*/.int
35230 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
35240 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ete(BtCursor *pC
35250 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20  ur){.  Btree *p 
35260 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
35270 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
35280 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
35290 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63         .  int rc
352a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
352b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
352c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
352d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
352e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
352f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
35300 74 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66  to delete cell f
35310 72 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  rom */.  unsigne
35320 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20  d char *pCell;  
35330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35340 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c   Pointer to cell
35350 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
35360 69 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20  int iCellIdx;   
35370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35380 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
35390 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20   cell to delete 
353a0 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65  */.  int iCellDe
353b0 70 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  pth;            
353c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70            /* Dep
353d0 74 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61  th of node conta
353e0 69 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a  ining pCell */ .
353f0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
35400 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
35410 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35420 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
35430 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
35440 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
35450 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
35460 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72  assert( pCur->wr
35470 46 6c 61 67 20 29 3b 0a 20 20 69 66 28 20 4e 45  Flag );.  if( NE
35480 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b  VER(pCur->aiIdx[
35490 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43  pCur->iPage]>=pC
354a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
354b0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20  >iPage]->nCell) 
354c0 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75  .   || NEVER(pCu
354d0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
354e0 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20  R_VALID).  ){.  
354f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35500 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74  ERROR;  /* Somet
35510 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61 77  hing has gone aw
35520 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ry. */.  }..  rc
35530 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43   = checkForReadC
35540 6f 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75 72  onflicts(p, pCur
35550 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
35560 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  , pCur->info.nKe
35570 79 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  y);.  if( rc!=SQ
35580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
35590 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
355a0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
355b0 41 43 48 45 20 29 3b 0a 20 20 20 20 72 65 74 75  ACHE );.    retu
355c0 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  rn rc;          
355d0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70    /* The table p
355e0 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
355f0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
35600 0a 20 20 7d 0a 0a 20 20 69 43 65 6c 6c 44 65 70  .  }..  iCellDep
35610 74 68 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  th = pCur->iPage
35620 3b 0a 20 20 69 43 65 6c 6c 49 64 78 20 3d 20 70  ;.  iCellIdx = p
35630 43 75 72 2d 3e 61 69 49 64 78 5b 69 43 65 6c 6c  Cur->aiIdx[iCell
35640 44 65 70 74 68 5d 3b 0a 20 20 70 50 61 67 65 20  Depth];.  pPage 
35650 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
35660 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20 20 70 43  CellDepth];.  pC
35670 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
35680 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 29 3b  Page, iCellIdx);
35690 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
356a0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
356b0 65 20 65 6e 74 72 79 20 74 6f 20 64 65 6c 65 74  e entry to delet
356c0 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20  e is not a leaf 
356d0 70 61 67 65 2c 20 6d 6f 76 65 0a 20 20 2a 2a 20  page, move.  ** 
356e0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
356f0 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20  e largest entry 
35700 69 6e 20 74 68 65 20 74 72 65 65 20 74 68 61 74  in the tree that
35710 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
35720 0a 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20  .  ** the entry 
35730 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54  being deleted. T
35740 68 69 73 20 63 65 6c 6c 20 77 69 6c 6c 20 72 65  his cell will re
35750 70 6c 61 63 65 20 74 68 65 20 63 65 6c 6c 20 62  place the cell b
35760 65 69 6e 67 20 64 65 6c 65 74 65 64 0a 20 20 2a  eing deleted.  *
35770 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  * from the inter
35780 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 65 20 27 70  nal node. The 'p
35790 72 65 76 69 6f 75 73 27 20 65 6e 74 72 79 20 69  revious' entry i
357a0 73 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  s used for this 
357b0 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6f 66 20  instead.  ** of 
357c0 74 68 65 20 27 6e 65 78 74 27 20 65 6e 74 72 79  the 'next' entry
357d0 2c 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  , as the previou
357e0 73 20 65 6e 74 72 79 20 69 73 20 61 6c 77 61 79  s entry is alway
357f0 73 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 0a  s a part of the.
35800 20 20 2a 2a 20 73 75 62 2d 74 72 65 65 20 68 65    ** sub-tree he
35810 61 64 65 64 20 62 79 20 74 68 65 20 63 68 69 6c  aded by the chil
35820 64 20 70 61 67 65 20 6f 66 20 74 68 65 20 63 65  d page of the ce
35830 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
35840 2e 20 54 68 69 73 20 6d 61 6b 65 73 0a 20 20 2a  . This makes.  *
35850 2a 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20  * balancing the 
35860 74 72 65 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tree following t
35870 68 65 20 64 65 6c 65 74 65 20 6f 70 65 72 61 74  he delete operat
35880 69 6f 6e 20 65 61 73 69 65 72 2e 20 20 2a 2f 0a  ion easier.  */.
35890 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
358a0 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 6f  af ){.    int no
358b0 74 55 73 65 64 3b 0a 20 20 20 20 69 66 28 20 53  tUsed;.    if( S
358c0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
358d0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
358e0 69 6f 75 73 28 70 43 75 72 2c 20 26 6e 6f 74 55  ious(pCur, &notU
358f0 73 65 64 29 29 20 29 7b 0a 20 20 20 20 20 20 72  sed)) ){.      r
35900 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
35910 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74    }..  /* Save t
35920 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
35930 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
35940 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
35950 61 62 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a  able before.  **
35960 20 6d 61 6b 69 6e 67 20 61 6e 79 20 6d 6f 64 69   making any modi
35970 66 69 63 61 74 69 6f 6e 73 2e 20 4d 61 6b 65 20  fications. Make 
35980 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
35990 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ing the entry to
359a0 20 62 65 20 0a 20 20 2a 2a 20 64 65 6c 65 74 65   be .  ** delete
359b0 64 20 77 72 69 74 61 62 6c 65 2e 20 54 68 65 6e  d writable. Then
359c0 20 66 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   free any overfl
359d0 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
359e0 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 20 20  ted with the .  
359f0 2a 2a 20 65 6e 74 72 79 20 61 6e 64 20 66 69 6e  ** entry and fin
35a00 61 6c 6c 79 20 72 65 6d 6f 76 65 20 74 68 65 20  ally remove the 
35a10 63 65 6c 6c 20 69 74 73 65 6c 66 20 66 72 6f 6d  cell itself from
35a20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
35a30 2e 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
35a40 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
35a50 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
35a60 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
35a70 20 70 43 75 72 29 29 0a 20 20 20 7c 7c 20 53 51   pCur)).   || SQ
35a80 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
35a90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35aa0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
35ab0 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
35ac0 4b 21 3d 28 72 63 20 3d 20 63 6c 65 61 72 43 65  K!=(rc = clearCe
35ad0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
35ae0 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
35af0 4b 21 3d 28 72 63 20 3d 20 64 72 6f 70 43 65 6c  K!=(rc = dropCel
35b00 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
35b10 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
35b20 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 29 0a 20  Page, pCell))). 
35b30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
35b40 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
35b50 74 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64  the cell deleted
35b60 20 77 61 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64   was not located
35b70 20 6f 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c   on a leaf page,
35b80 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
35b90 0a 20 20 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  .  ** is current
35ba0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ly pointing to t
35bb0 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79  he largest entry
35bc0 20 69 6e 20 74 68 65 20 73 75 62 2d 74 72 65 65   in the sub-tree
35bd0 20 68 65 61 64 65 64 0a 20 20 2a 2a 20 62 79 20   headed.  ** by 
35be0 74 68 65 20 63 68 69 6c 64 2d 70 61 67 65 20 6f  the child-page o
35bf0 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20  f the cell that 
35c00 77 61 73 20 6a 75 73 74 20 64 65 6c 65 74 65 64  was just deleted
35c10 20 66 72 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61   from an interna
35c20 6c 0a 20 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65  l.  ** node. The
35c30 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c   cell from the l
35c40 65 61 66 20 6e 6f 64 65 20 6e 65 65 64 73 20 74  eaf node needs t
35c50 6f 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68  o be moved to th
35c60 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20  e internal.  ** 
35c70 6e 6f 64 65 20 74 6f 20 72 65 70 6c 61 63 65 20  node to replace 
35c80 74 68 65 20 64 65 6c 65 74 65 64 20 63 65 6c 6c  the deleted cell
35c90 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
35ca0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
35cb0 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 20 3d  MemPage *pLeaf =
35cc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
35cd0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
35ce0 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 50  int nCell;.    P
35cf0 67 6e 6f 20 6e 20 3d 20 70 43 75 72 2d 3e 61 70  gno n = pCur->ap
35d00 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74 68 2b  Page[iCellDepth+
35d10 31 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 6e  1]->pgno;.    un
35d20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 54 6d  signed char *pTm
35d30 70 3b 0a 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  p;..    pCell = 
35d40 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 2c 20  findCell(pLeaf, 
35d50 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pLeaf->nCell-1);
35d60 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 63 65 6c  .    nCell = cel
35d70 6c 53 69 7a 65 50 74 72 28 70 4c 65 61 66 2c 20  lSizePtr(pLeaf, 
35d80 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65  pCell);.    asse
35d90 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  rt( MX_CELL_SIZE
35da0 28 70 42 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a  (pBt)>=nCell );.
35db0 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
35dc0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
35dd0 20 70 54 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d   pTmp = pBt->pTm
35de0 70 53 70 61 63 65 3b 0a 0a 20 20 20 20 69 66 28  pSpace;..    if(
35df0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
35e00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
35e10 69 74 65 28 70 4c 65 61 66 2d 3e 70 44 62 50 61  ite(pLeaf->pDbPa
35e20 67 65 29 29 20 0a 20 20 20 20 20 7c 7c 20 53 51  ge)) .     || SQ
35e30 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 69  LITE_OK!=(rc = i
35e40 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c  nsertCell(pPage,
35e50 20 69 43 65 6c 6c 49 64 78 2c 20 70 43 65 6c 6c   iCellIdx, pCell
35e60 2d 34 2c 20 6e 43 65 6c 6c 2b 34 2c 20 70 54 6d  -4, nCell+4, pTm
35e70 70 2c 20 6e 29 29 0a 20 20 20 20 20 7c 7c 20 53  p, n)).     || S
35e80 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
35e90 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 2c 20  dropCell(pLeaf, 
35ea0 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20  pLeaf->nCell-1, 
35eb0 6e 43 65 6c 6c 29 29 0a 20 20 20 20 29 7b 0a 20  nCell)).    ){. 
35ec0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
35ed0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
35ee0 42 61 6c 61 6e 63 65 20 74 68 65 20 74 72 65 65  Balance the tree
35ef0 2e 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 64  . If the entry d
35f00 65 6c 65 74 65 64 20 77 61 73 20 6c 6f 63 61 74  eleted was locat
35f10 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61 67  ed on a leaf pag
35f20 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e,.  ** then the
35f30 20 63 75 72 73 6f 72 20 73 74 69 6c 6c 20 70 6f   cursor still po
35f40 69 6e 74 73 20 74 6f 20 74 68 61 74 20 70 61 67  ints to that pag
35f50 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
35f60 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 63  the first.  ** c
35f70 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29  all to balance()
35f80 20 72 65 70 61 69 72 73 20 74 68 65 20 74 72 65   repairs the tre
35f90 65 2c 20 61 6e 64 20 74 68 65 20 69 66 28 2e 2e  e, and the if(..
35fa0 2e 29 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 0a  .) condition is.
35fb0 20 20 2a 2a 20 6e 65 76 65 72 20 74 72 75 65 2e    ** never true.
35fc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72  .  **.  ** Other
35fd0 77 69 73 65 2c 20 69 66 20 74 68 65 20 65 6e 74  wise, if the ent
35fe0 72 79 20 64 65 6c 65 74 65 64 20 77 61 73 20 6f  ry deleted was o
35ff0 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  n an internal no
36000 64 65 20 70 61 67 65 2c 20 74 68 65 6e 0a 20 20  de page, then.  
36010 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  ** pCur is point
36020 69 6e 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20  ing to the leaf 
36030 70 61 67 65 20 66 72 6f 6d 20 77 68 69 63 68 20  page from which 
36040 61 20 63 65 6c 6c 20 77 61 73 20 72 65 6d 6f 76  a cell was remov
36050 65 64 20 74 6f 0a 20 20 2a 2a 20 72 65 70 6c 61  ed to.  ** repla
36060 63 65 20 74 68 65 20 63 65 6c 6c 20 64 65 6c 65  ce the cell dele
36070 74 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  ted from the int
36080 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 69 73  ernal node. This
36090 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 2a   is slightly.  *
360a0 2a 20 74 72 69 63 6b 79 20 61 73 20 74 68 65 20  * tricky as the 
360b0 6c 65 61 66 20 6e 6f 64 65 20 6d 61 79 20 62 65  leaf node may be
360c0 20 75 6e 64 65 72 66 75 6c 6c 2c 20 61 6e 64 20   underfull, and 
360d0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
360e0 65 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 65 69  e may.  ** be ei
360f0 74 68 65 72 20 75 6e 64 65 72 20 6f 72 20 6f 76  ther under or ov
36100 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20  erfull. In this 
36110 63 61 73 65 20 72 75 6e 20 74 68 65 20 62 61 6c  case run the bal
36120 61 6e 63 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d  ancing algorithm
36130 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 61  .  ** on the lea
36140 66 20 6e 6f 64 65 20 66 69 72 73 74 2e 20 49 66  f node first. If
36150 20 74 68 65 20 62 61 6c 61 6e 63 65 20 70 72 6f   the balance pro
36160 63 65 65 64 73 20 66 61 72 20 65 6e 6f 75 67 68  ceeds far enough
36170 20 75 70 20 74 68 65 0a 20 20 2a 2a 20 74 72 65   up the.  ** tre
36180 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 62 65  e that we can be
36190 20 73 75 72 65 20 74 68 61 74 20 61 6e 79 20 70   sure that any p
361a0 72 6f 62 6c 65 6d 20 69 6e 20 74 68 65 20 69 6e  roblem in the in
361b0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 68 61 73 0a  ternal node has.
361c0 20 20 2a 2a 20 62 65 65 6e 20 63 6f 72 72 65 63    ** been correc
361d0 74 65 64 2c 20 73 6f 20 62 65 20 69 74 2e 20 4f  ted, so be it. O
361e0 74 68 65 72 77 69 73 65 2c 20 61 66 74 65 72 20  therwise, after 
361f0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 6c 65  balancing the le
36200 61 66 20 6e 6f 64 65 2c 0a 20 20 2a 2a 20 77 61  af node,.  ** wa
36210 6c 6b 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  lk the cursor up
36220 20 74 68 65 20 74 72 65 65 20 74 6f 20 74 68 65   the tree to the
36230 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 61   internal node a
36240 6e 64 20 62 61 6c 61 6e 63 65 20 69 74 20 61 73  nd balance it as
36250 20 0a 20 20 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f   .  ** well.  */
36260 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
36270 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
36280 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43  =SQLITE_OK && pC
36290 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44  ur->iPage>iCellD
362a0 65 70 74 68 20 29 7b 0a 20 20 20 20 77 68 69 6c  epth ){.    whil
362b0 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 69  e( pCur->iPage>i
362c0 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20 20 20  CellDepth ){.   
362d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
362e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
362f0 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20  ->iPage--]);.   
36300 20 7d 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61   }.    rc = bala
36310 6e 63 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  nce(pCur);.  }..
36320 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36330 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
36340 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
36350 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36360 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
36370 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
36380 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
36390 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
363a0 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
363b0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
363c0 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
363d0 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
363e0 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
363f0 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
36400 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
36410 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
36420 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
36430 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
36440 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
36450 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
36460 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
36470 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
36480 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
36490 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
364a0 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
364b0 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
364c0 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
364d0 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
364e0 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
364f0 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73  SQL indices.*/.s
36500 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
36510 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
36520 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
36530 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
36540 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
36550 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
36560 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
36570 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
36580 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
36590 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
365a0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
365b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
365c0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
365d0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
365e0 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
365f0 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  nly );..#ifdef S
36600 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
36610 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c  ACUUM.  rc = all
36620 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
36630 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
36640 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
36650 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
36660 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c  turn rc;.  }.#el
36670 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  se.  if( pBt->au
36680 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
36690 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20  Pgno pgnoMove;  
366a0 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61      /* Move a pa
366b0 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20  ge here to make 
366c0 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f  room for the roo
366d0 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65  t-page */.    Me
366e0 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65  mPage *pPageMove
366f0 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f  ; /* The page to
36700 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20   move to. */..  
36710 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20    /* Creating a 
36720 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72  new table may pr
36730 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d  obably require m
36740 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  oving an existin
36750 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  g database.    *
36760 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  * to make room f
36770 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
36780 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20  s root page. In 
36790 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74  case this page t
367a0 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20  urns.    ** out 
367b0 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  to be an overflo
367c0 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61  w page, delete a
367d0 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ll overflow page
367e0 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20  -map caches.    
367f0 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20  ** held by open 
36800 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a  cursors..    */.
36810 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
36820 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
36830 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  Bt);..    /* Rea
36840 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  d the value of m
36850 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20  eta[3] from the 
36860 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65  database to dete
36870 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a  rmine where the.
36880 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
36890 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
368a0 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74  e should go. met
368b0 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67  a[3] is the larg
368c0 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
368d0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20    ** created so 
368e0 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20  far, so the new 
368f0 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65  root-page is (me
36900 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f  ta[3]+1)..    */
36910 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36920 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
36930 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52   BTREE_LARGEST_R
36940 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67 6e 6f 52  OOT_PAGE, &pgnoR
36950 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  oot);.    if( rc
36960 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36970 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36980 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f      }.    pgnoRo
36990 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ot++;..    /* Th
369a0 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
369b0 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63  may not be alloc
369c0 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65  ated on a pointe
369d0 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74  r-map page, or t
369e0 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e  he.    ** PENDIN
369f0 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20  G_BYTE page..   
36a00 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
36a10 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f  gnoRoot==PTRMAP_
36a20 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f  PAGENO(pBt, pgno
36a30 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20  Root) ||.       
36a40 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49   pgnoRoot==PENDI
36a50 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
36a60 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52  ) ){.      pgnoR
36a70 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  oot++;.    }.   
36a80 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f   assert( pgnoRoo
36a90 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  t>=3 );..    /* 
36aa0 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e  Allocate a page.
36ab0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
36ac0 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73  urrently resides
36ad0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c   at pgnoRoot wil
36ae0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65  l.    ** be move
36af0 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  d to the allocat
36b00 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20  ed page (unless 
36b10 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
36b20 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a  ge happens.    *
36b30 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74 20 70  * to reside at p
36b40 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f  gnoRoot)..    */
36b50 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
36b60 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
36b70 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67   &pPageMove, &pg
36b80 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74  noMove, pgnoRoot
36b90 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
36ba0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36bb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36bc0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
36bd0 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f  gnoMove!=pgnoRoo
36be0 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67  t ){.      /* pg
36bf0 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61  noRoot is the pa
36c00 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ge that will be 
36c10 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  used for the roo
36c20 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20  t-page of.      
36c30 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
36c40 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72   (assuming an er
36c50 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75  ror did not occu
36c60 72 29 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a  r). But we were.
36c70 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
36c80 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20  ed pgnoMove. If 
36c90 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69  required (i.e. i
36ca0 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c  f it was not all
36cb0 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ocated.      ** 
36cc0 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65  by extending the
36cd0 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72   file), the curr
36ce0 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73 69  ent page at posi
36cf0 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20  tion pgnoMove.  
36d00 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64      ** is alread
36d10 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20  y journaled..   
36d20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65     */.      u8 e
36d30 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Type;.      Pgno
36d40 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
36d50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
36d60 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20  ageMove);..     
36d70 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67   /* Move the pag
36d80 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70  e currently at p
36d90 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d  gnoRoot to pgnoM
36da0 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ove. */.      rc
36db0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
36dc0 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
36dd0 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
36de0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
36df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36e00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
36e20 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
36e30 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79  , pgnoRoot, &eTy
36e40 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
36e50 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
36e60 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
36e70 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
36e80 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
36e90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
36ea0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
36eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
36ec0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36ed0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
36ee0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
36ef0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
36f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36f10 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
36f20 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
36f30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
36f40 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMAP_FR
36f50 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  EEPAGE );.      
36f60 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
36f70 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54  e(pBt, pRoot, eT
36f80 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70  ype, iPtrPage, p
36f90 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20  gnoMove, 0);.   
36fa0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
36fb0 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Root);..      /*
36fc0 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   Obtain the page
36fd0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a   at pgnoRoot */.
36fe0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37000 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37010 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
37020 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
37030 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f  Page(pBt, pgnoRo
37040 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a  ot, &pRoot, 0);.
37050 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37070 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37080 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
37090 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
370a0 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  te(pRoot->pDbPag
370b0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
370c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
370d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
370e0 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
370f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37100 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
37110 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70  .      pRoot = p
37120 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20  PageMove;.    } 
37130 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
37140 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
37150 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69  and meta-data wi
37160 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  th the new root-
37170 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  page number. */.
37180 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
37190 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ut(pBt, pgnoRoot
371a0 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
371b0 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
371c0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  c ){.      relea
371d0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
371e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
371f0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
37200 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
37210 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f  eMeta(p, 4, pgno
37220 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
37230 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  c ){.      relea
37240 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
37250 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37260 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
37270 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
37280 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
37290 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
372a0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 1, 0);.    if
372b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
372c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61  ;.  }.#endif.  a
372d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
372e0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
372f0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29  Root->pDbPage) )
37300 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f  ;.  zeroPage(pRo
37310 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f  ot, flags | PTF_
37320 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  LEAF);.  sqlite3
37330 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74  PagerUnref(pRoot
37340 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70  ->pDbPage);.  *p
37350 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67  iTable = (int)pg
37360 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e  noRoot;.  return
37370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
37380 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  t sqlite3BtreeCr
37390 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20  eateTable(Btree 
373a0 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65  *p, int *piTable
373b0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
373c0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
373d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
373e0 20 20 72 63 20 3d 20 62 74 72 65 65 43 72 65 61    rc = btreeCrea
373f0 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61 62  teTable(p, piTab
37400 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73 71  le, flags);.  sq
37410 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
37420 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
37430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
37440 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61  the given databa
37450 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  se page and all 
37460 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52  its children.  R
37470 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67  eturn.** the pag
37480 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
37490 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
374a0 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
374b0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
374c0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
374d0 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61 74  * The BTree that
374e0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61   contains the ta
374f0 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ble */.  Pgno pg
37500 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  no,            /
37510 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
37520 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69 6e 74 20   clear */.  int 
37530 66 72 65 65 50 61 67 65 46 6c 61 67 2c 20 20 20  freePageFlag,   
37540 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20    /* Deallocate 
37550 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  page if true */.
37560 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 0a    int *pnChange.
37570 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
37580 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
37590 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
375a0 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74  ar *pCell;.  int
375b0 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   i;..  assert( s
375c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
375d0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
375e0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65  .  if( pgno>page
375f0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
37600 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
37610 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
37620 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67  T;.  }..  rc = g
37630 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
37640 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29  t, pgno, &pPage)
37650 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
37660 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
37670 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69  age_out;.  for(i
37680 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
37690 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43  ll; i++){.    pC
376a0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
376b0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66  Page, i);.    if
376c0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
376d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65  {.      rc = cle
376e0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
376f0 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65  Bt, get4byte(pCe
37700 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65  ll), 1, pnChange
37710 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
37720 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
37730 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
37740 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65    }.    rc = cle
37750 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
37760 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
37770 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
37780 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
37790 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
377a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
377b0 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
377c0 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
377d0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
377e0 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65  8]), 1, pnChange
377f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
37800 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
37810 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 65  sepage_out;.  }e
37820 6c 73 65 20 69 66 28 20 70 6e 43 68 61 6e 67 65  lse if( pnChange
37830 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37840 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
37850 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65 20 2b  .    *pnChange +
37860 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
37870 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61    }.  if( freePa
37880 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  geFlag ){.    rc
37890 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
378a0 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  e);.  }else if( 
378b0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
378c0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
378d0 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20  DbPage))==0 ){. 
378e0 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
378f0 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e, pPage->aData[
37900 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a  0] | PTF_LEAF);.
37910 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61    }..cleardataba
37920 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65  sepage_out:.  re
37930 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
37940 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
37950 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
37960 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ll information f
37970 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62  rom a single tab
37980 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
37990 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a  se.  iTable is.*
379a0 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
379b0 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66  r of the root of
379c0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74   the table.  Aft
379d0 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
379e0 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20  returns,.** the 
379f0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
37a00 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78  ty, but still ex
37a10 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ists..**.** This
37a20 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
37a30 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
37a40 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
37a50 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72  re any open.** r
37a60 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ead cursors on t
37a70 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20  he table.  Open 
37a80 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
37a90 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
37aa0 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  * root of the ta
37ab0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e  ble..**.** If pn
37ac0 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e 55  Change is not NU
37ad0 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65 20 69  LL, then table i
37ae0 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6e  Table must be an
37af0 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20 54   intkey table. T
37b00 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61  he.** integer va
37b10 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lue pointed to b
37b20 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20 69 6e  y pnChange is in
37b30 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  cremented by the
37b40 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6e   number of.** en
37b50 74 72 69 65 73 20 69 6e 20 74 68 65 20 74 61 62  tries in the tab
37b60 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
37b70 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
37b80 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
37b90 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 6e 43  iTable, int *pnC
37ba0 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  hange){.  int rc
37bb0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
37bc0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
37bd0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
37be0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
37bf0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
37c00 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 28  WRITE );.  if( (
37c10 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61  rc = checkForRea
37c20 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
37c30 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53 51  able, 0, 1))!=SQ
37c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
37c50 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
37c60 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 53  */.  }else if( S
37c70 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
37c80 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
37c90 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20  Bt, iTable, 0)) 
37ca0 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e  ){.    /* nothin
37cb0 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c  g to do */.  }el
37cc0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65  se{.    rc = cle
37cd0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
37ce0 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
37cf0 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a  , 0, pnChange);.
37d00 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
37d10 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
37d20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37d30 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f  * Erase all info
37d40 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62  rmation in a tab
37d50 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 72  le and add the r
37d60 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
37d70 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c   to.** the freel
37d80 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68  ist.  Except, th
37d90 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72  e root of the pr
37da0 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74  inciple table (t
37db0 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67  he one on.** pag
37dc0 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61 64  e 1) is never ad
37dd0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
37de0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ist..**.** This 
37df0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
37e00 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
37e10 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
37e20 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75  e any open.** cu
37e30 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
37e40 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54  le..**.** If AUT
37e50 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c  OVACUUM is enabl
37e60 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
37e70 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74  at iTable is not
37e80 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f   the last.** roo
37e90 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  t page in the da
37ea0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
37eb0 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  n the last root 
37ec0 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  page .** in the 
37ed0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
37ee0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
37ef0 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
37f00 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61  cupied by.** iTa
37f10 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73  ble and that las
37f20 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20  t slot formerly 
37f30 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65 20  occupied by the 
37f40 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a  last root page.*
37f50 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
37f60 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65  e freelist inste
37f70 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49  ad of iTable.  I
37f80 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a  n this say, all.
37f90 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72  ** root pages ar
37fa0 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62 65  e kept at the be
37fb0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
37fc0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
37fd0 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73  ich.** is necess
37fe0 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55  ary for AUTOVACU
37ff0 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74  UM to work right
38000 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  .  *piMoved is s
38010 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61  et to the .** pa
38020 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75  ge number that u
38030 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  sed to be the la
38040 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  st root page in 
38050 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  the file before.
38060 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66  ** the move.  If
38070 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f   no page gets mo
38080 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73  ved, *piMoved is
38090 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68   set to 0..** Th
380a0 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
380b0 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20   is recorded in 
380c0 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20  meta[3] and the 
380d0 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61  value of.** meta
380e0 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20 62  [3] is updated b
380f0 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  y this procedure
38100 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
38110 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  btreeDropTable(B
38120 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
38130 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76  able, int *piMov
38140 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
38150 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
38160 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
38170 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
38180 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
38190 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
381a0 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
381b0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
381c0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20 2f  NS_WRITE );..  /
381d0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
381e0 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20  to drop a table 
381f0 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  if any cursors a
38200 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20  re open on the. 
38210 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
38220 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
38230 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
38240 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61  e the backend ma
38250 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d  y.  ** need to m
38260 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74  ove another root
38270 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20  -page to fill a 
38280 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
38290 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f  deleted.  ** roo
382a0 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70  t page. If an op
382b0 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73  en cursor was us
382c0 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61 20  ing this page a 
382d0 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20  problem would . 
382e0 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a   ** occur..  */.
382f0 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
38300 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
38310 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
38320 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70  ed(p->db, pBt->p
38330 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d 3e  Cursor->pBtree->
38340 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
38350 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
38360 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
38370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
38380 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
38390 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70  (Pgno)iTable, &p
383a0 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
383b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
383c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
383d0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c  reeClearTable(p,
383e0 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 69   iTable, 0);.  i
383f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c  f( rc ){.    rel
38400 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
38410 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
38420 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20    }..  *piMoved 
38430 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62  = 0;..  if( iTab
38440 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53  le>1 ){.#ifdef S
38450 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
38460 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66  ACUUM.    rc = f
38470 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
38480 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
38490 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20  pPage);.#else.  
384a0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
384b0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50  acuum ){.      P
384c0 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b  gno maxRootPgno;
384d0 0a 20 20